Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.95/43: Рейтинг темы: голосов - 43, средняя оценка - 4.95
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
1
.NET 4.x

Создать и запустить одновременно несколько потоков

08.04.2014, 21:59. Показов 8482. Ответов 14
Метки нет (Все метки)

Всем привет)
Необходимо создать несколько потоков и запустить их одновременно (без помощи циклов).
Как это сделать?
Помогите пожалуйста)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2014, 21:59
Ответы с готовыми решениями:

Правильно создать пул потоков, запустить эти потоки одновременно и дождаться их завершения
Добрый день! Подскажите пожалуйста, как правильно создать пул потоков, запустить эти потоки...

Как запустить поочередно несколько потоков?
Изучаю многопоточность. Столкнулся со следующей проблемой. Имеется такой вот гипотетический код: ...

Как запустить несколько потоков одновременно?
Здравствуйте, не могу решить проблему с объявлением количества потоков, нужно чтобы запускалось...

Запуск несколько фоновых потоков одновременно
Необходимо заполнять массив из n элементов. Как организовать заполнение массива одновременно в...

14
985 / 883 / 353
Регистрация: 24.03.2014
Сообщений: 2,381
Записей в блоге: 2
08.04.2014, 22:01 2
Да хоть List<Thread> делайте, что не получается?
0
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
08.04.2014, 22:03  [ТС] 3
C#
1
2
3
4
5
6
7
List<Thread> threads = new List<Thread>();
 
for (int i = 0; i < threadCount; i++)
{
    Thread thread = new Thread(Work);
    threads.Add(thread);
}
А как их потом все запустить одновременно?
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.04.2014, 22:38 4
ну запускай рекурсивно, раз циклами нельзя

Добавлено через 1 минуту
C#
1
2
3
4
5
6
7
void Start(Thread[] threads, int index)
{
   if (threads == null || index >= thread.Length)
      return;
   threads[index].Start();
   Start(threads, index + 1);
}
0
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
08.04.2014, 23:03  [ТС] 5
Psilon, а разве в этом случае потоки запустятся одновременно?
нужно одновременно

Добавлено через 20 минут
Нашел решение, но не знаю насколько оно правильное
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
class MyThread
    {
        public Thread Thrd;
        ManualResetEvent mre;
 
        public MyThread(string name, ManualResetEvent evt)
        {
            Thrd = new Thread(this.Run);
            Thrd.Name = name;
            mre = evt;
            Thrd.Start();
        }
 
        void Run()
        {
            Console.WriteLine("Внутри потока " + Thrd.Name);
 
            for (int i = 0; i < 50; i++)
            {
                Console.WriteLine(Thrd.Name);
            }
 
            Console.WriteLine(Thrd.Name + " завершен!");
 
            // Уведомление о событии
            mre.Set();
        }
    }
 
    class Program
    {
        static void Main()
        {
            ManualResetEvent evtObj = new ManualResetEvent(false);
 
            List<MyThread> threads = new List<MyThread>();
 
            for (int i = 0; i < 10; i++)
            {
                MyThread mt = new MyThread("Событийный поток " + i.ToString(), evtObj);
                threads.Add(mt);
            }
 
            Console.WriteLine("Основной поток ожидает событие");
 
            evtObj.WaitOne();
 
            evtObj.Reset();
 
            Console.ReadLine();
        }
    }
0
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
08.04.2014, 23:07 6
в любом случае орновременно не выйдет , если немного о компьютере понятие имеете
0
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
08.04.2014, 23:27  [ТС] 7
Как мне кажется, поток должен начинать свою работу по какому-то событию.
Как сделать так, чтобы поток начал стартовать по событию?
0
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
08.04.2014, 23:29 8
Цитата Сообщение от Badfish Посмотреть сообщение
Как сделать так, чтобы поток начал стартовать по событию?
в обработчике события запустить поток
0
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
08.04.2014, 23:34  [ТС] 9
Metall_Version, а сразу несколько потоков получится запустить одновременно в обработчике событий?
0
Модератор
Эксперт .NET
5305 / 4101 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
08.04.2014, 23:37 10
Badfish, вряд ли это возможно, в том смысле, что будет точно одновременно (как выше уже указали). А в обработчике-да без проблем.... Сейчас, сей секунд...
0
2141 / 1278 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
08.04.2014, 23:39 11
чисто технически одновременно они никак не запустятся .

можно на событие подписать несколько методов. в каждом запустить свой поток.
а можно просто через один делегат сколько угодно запустить. но опять же будет очередность какая то как ни крути
1
Модератор
Эксперт .NET
5305 / 4101 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
08.04.2014, 23:48 12
Badfish, вот Вам 6 потоков.
На форме кнопка и 6 лейблов...
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Threading.Tasks;
 
namespace Badfish
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click += (sender, e) =>
                {
                    Task.Factory.StartNew(()=>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label1.InvokeRequired)
                                {
                                    label1.Invoke(new Action(() => label1.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                    Task.Factory.StartNew(() =>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label2.InvokeRequired)
                                {
                                    label2.Invoke(new Action(() => label2.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                    Task.Factory.StartNew(() =>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label3.InvokeRequired)
                                {
                                    label3.Invoke(new Action(() => label3.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                    Task.Factory.StartNew(() =>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label4.InvokeRequired)
                                {
                                    label4.Invoke(new Action(() => label4.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                    Task.Factory.StartNew(() =>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label5.InvokeRequired)
                                {
                                    label5.Invoke(new Action(() => label5.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                    Task.Factory.StartNew(() =>
                        {
                            for (int i = 0; i < 100000; i++)
                            {
                                if (label6.InvokeRequired)
                                {
                                    label6.Invoke(new Action(() => label6.Text = i.ToString()));
                                }
                                Thread.Sleep(100);
                            }
                        });
                };
        }
    }
}
(Изврат, конечно, но что просили, да и быстрее так...)
1
1 / 1 / 1
Регистрация: 28.09.2012
Сообщений: 54
09.04.2014, 00:06  [ТС] 13
insite2012, Довольно забавно получилось)
но потоки все равно не стартуют одновременно)
как вы думаете Parallel.For(0, 10, i => Work()) выполнит поставленную задачу?
Metall_Version, да, я понимаю, что потоки все равно не вызовутся одновременно)
0
Модератор
Эксперт .NET
5305 / 4101 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
09.04.2014, 00:13 14
Цитата Сообщение от Badfish Посмотреть сообщение
Довольно забавно получилось)
но потоки все равно не стартуют одновременно)
Да, весело)))
Но я думаю, что вряд ли это вообще возможно - чтобы они все запустились полностью одновременно. Разница все равно будет...
0
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.04.2014, 00:51 15
Badfish, не существует таких средств, чтобы обеспечить абсолютно одновременное выполнение разных потоков. Принципиально существует. И никакие средства фреймворка или сторонних библиотек преодолеть физическое ограничение не помогут.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2014, 00:51

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Ресурсоемкость потоков, есть ли способы выполнять несколько операций одновременно, не загружая CPU?
Как решить проблему ресурсоемкости потоков(Thread)? Есть ли способы выполнять более 2х операций...

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

Как запустить несколько потоков чтения/записи одновременно?
Делаю загрузку файлов на сервер. Хочу использовать потоки. Я попытался кое-что сделать: ...

Запустить несколько таймеров одновременно
Здравствуйте. Мне надо сделать чтобы несколько таймеров работало одновременно. Допустим пусть...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.