1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
1

Как запустить сразу 4 потока?

08.03.2015, 12:17. Показов 1440. Ответов 2
Метки нет (Все метки)

здравствуйте, у меня такая задача: есть 4 текстбокса и кнопка "старт". при её нажатии все 4 текстбокса должны одновременно заполниться числами от 0 до 100. как это сделать в 4 потоках? т.е. чтоб они одновременно заполнялись, а не по очереди?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.03.2015, 12:17
Ответы с готовыми решениями:

Как запустить метод в главном потоке из не главного потока?
Прив. У меня такая трабла, пишу клиент, для игры на одном движке, и если от сервера пришла какая-то...

Если запустить 2 потока, будет ли один ждать, пока завершится другой
Здравствуйте! Возможно вопрос глупый, но вот никак не пойму Есть цыкл каторый выполняеться n-е...

Из одного потока запустить другой. Завершение первого не должно сказываться на работе второго
Нужно из основного потока (а) вызвать определенный метод (файловый ввод\вывод, выполняется долго)...

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не запущен. Например,...

2
1272 / 1209 / 199
Регистрация: 19.02.2010
Сообщений: 3,504
08.03.2015, 22:44 2
Шарповый класс для потоков не видел (и шарпа - тоже), поэтому рецепт для чистого ВинАПИ, но логика пойдёт и для шарпа.
Надо заранее создать 4 потока в неактивном (с флагом CREATE_SUSPENDED) режиме. В нужный момент - сказать всем четырём ResumeThread(...);
Ибо если создавать потоки тогда, когда непосредственно потребуется их работа - то может оказаться так, что первый поток уже отработает своё, а третий-четвёртый ещё не запустятся (ибо создание потока м.б. времязатратной для операционки операцией, да и планировщик потоков может неизвестно насколько (ибо в системе работают и другие процессы-потоки, - не только Ваша прога) притормозить исполнение главного потока Вашей проги после того, когда она запустит 1-2 дочерних потока - они отработают, а третий-четвёртый ещё останутся незапущенными).
0
Эксперт .NET
4430 / 2090 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
08.03.2015, 22:49 3
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace MultiThreadingExample
{
    public partial class MainForm : Form
    {
        private readonly TextBox[] _textBoxes;
 
        public MainForm()
        {
            InitializeComponent();
 
            List<TextBox> temp = new List<TextBox>(panel1.Controls.Count);
            foreach (var control in panel1.Controls)
            {
                if (control is TextBox)
                {
                    temp.Add(control as TextBox);
                }
            }
            _textBoxes = temp.ToArray();
        }
 
        private void StartButton_Click(object sender, EventArgs e)
        {
            StartTasks();
        }
 
        private void StartTasks()
        {
            for (int i = 0; i < _textBoxes.Length; i++)
            {
                int local = i;
                Task.Factory.StartNew(() =>
                {
                    for (int j = 1; j < 101; j++)
                    {
                        UpdateTextBox(_textBoxes[local], j.ToString());
                        Thread.Sleep(100);
                    }
                });
            }
        }
 
        private void UpdateTextBox(TextBox textBox, string value)
        {
            if (textBox.InvokeRequired)
            {
                textBox.Invoke((Action<TextBox, string>)UpdateTextBox, textBox, value);
            }
            else
            {
                textBox.Text = value;
            }
        }
    }
}
Добавлено через 3 минуты
Task != Thread, просто берётся из пула потоков свободный и выполняет задачу. Если принципиально, то на Thread переделать не составит труда.

Добавлено через 57 секунд
В окно кинь Panel, в него 4 текстбокса и кнопку

Добавлено через 12 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
namespace MultiThreadingExample
{
    partial class MainForm
    {
        /// <summary>
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором форм Windows
 
        /// <summary>
        /// Обязательный метод для поддержки конструктора - не изменяйте
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            this.startButton = new System.Windows.Forms.Button();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.textBox3 = new System.Windows.Forms.TextBox();
            this.textBox4 = new System.Windows.Forms.TextBox();
            this.panel1 = new System.Windows.Forms.Panel();
            this.panel1.SuspendLayout();
            this.SuspendLayout();
            // 
            // startButton
            // 
            this.startButton.Anchor = System.Windows.Forms.AnchorStyles.Bottom;
            this.startButton.Location = new System.Drawing.Point(73, 135);
            this.startButton.Name = "startButton";
            this.startButton.Size = new System.Drawing.Size(108, 23);
            this.startButton.TabIndex = 0;
            this.startButton.Text = "Старт";
            this.startButton.UseVisualStyleBackColor = true;
            this.startButton.Click += new System.EventHandler(this.StartButton_Click);
            // 
            // textBox1
            // 
            this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox1.Location = new System.Drawing.Point(18, 11);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(221, 20);
            this.textBox1.TabIndex = 1;
            // 
            // textBox2
            // 
            this.textBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox2.Location = new System.Drawing.Point(18, 37);
            this.textBox2.Name = "textBox2";
            this.textBox2.Size = new System.Drawing.Size(221, 20);
            this.textBox2.TabIndex = 2;
            // 
            // textBox3
            // 
            this.textBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox3.Location = new System.Drawing.Point(18, 63);
            this.textBox3.Name = "textBox3";
            this.textBox3.Size = new System.Drawing.Size(221, 20);
            this.textBox3.TabIndex = 3;
            // 
            // textBox4
            // 
            this.textBox4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.textBox4.Location = new System.Drawing.Point(18, 89);
            this.textBox4.Name = "textBox4";
            this.textBox4.Size = new System.Drawing.Size(221, 20);
            this.textBox4.TabIndex = 4;
            // 
            // panel1
            // 
            this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.panel1.Controls.Add(this.textBox2);
            this.panel1.Controls.Add(this.textBox4);
            this.panel1.Controls.Add(this.textBox1);
            this.panel1.Controls.Add(this.textBox3);
            this.panel1.Location = new System.Drawing.Point(0, 4);
            this.panel1.Name = "panel1";
            this.panel1.Size = new System.Drawing.Size(252, 125);
            this.panel1.TabIndex = 5;
            // 
            // MainForm
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(253, 170);
            this.Controls.Add(this.panel1);
            this.Controls.Add(this.startButton);
            this.Name = "MainForm";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "Form1";
            this.panel1.ResumeLayout(false);
            this.panel1.PerformLayout();
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private System.Windows.Forms.Button startButton;
        private System.Windows.Forms.TextBox textBox1;
        private System.Windows.Forms.TextBox textBox2;
        private System.Windows.Forms.TextBox textBox3;
        private System.Windows.Forms.TextBox textBox4;
        private System.Windows.Forms.Panel panel1;
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.03.2015, 22:49
Помогаю со студенческими работами здесь

Как вне потока запустить цикл который был остановлен
Вот поток есть допустим 100 циклов for, прошло 36 и в catch вылезла ошибка, типо сервис...

Как запустить сразу два проекта в решении (серверная часть и клиентская)
Я не силен пока в терминологии... так что если что извиняйте... но вообщем суть такая есть есть...

Как мне запустить сразу все ярлыки находящиеся в данной папке? Без запуска каждого по отдельности?
Как мне запустить сразу все ярлыки находящиеся в данной папке? Без запуска каждого по отдельности? ...

Возможно ли запустить в цикле потока проверку буфера обмена?
Добрый день. Возможно ли как то запустить в цикле в потоке проверку буфера обмена?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru