Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132

Последовательность выполнения потоков

04.01.2019, 03:18. Показов 2645. Ответов 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
  void Replicate(string sometext)                             
        {
            Thread thread1 = new Thread(mainTHREAD);                // инициализация первого потока
               thread1.IsBackground = false;
                 thread1.Start(sometext);
            Thread thread2 = new Thread(mainTHREAD);               // инициализация второго потока
               thread2.IsBackground = false;
                 thread2.Start(sometext);
        
void mainTHREAD(object data)                               // главная функция потоков
  {
     string sometext3=(string) data;
     //...
}
 
        private void button1_Click(object sender, EventArgs e)
        {
            //...
                string sometext1;
                  Replicate (sometext1);                                  
                 
                    
        }
Поток thread2 не запускается на исполнение, пока не отработает thread1. Как сделать так, чтобы thread1 и thread2 работали одновременно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2019, 03:18
Ответы с готовыми решениями:

Нужен пример с возможностью прерывания выполнения потоков
Добрый вечер, форумчане. Собственно, столкнулся с необходимостью использования нескольких потоков. В качестве тестовой программы решил...

Разделить время выполнения потоков
Я только начал изучать потоки, так что возможно это нубский вопрос, но как организовать чтобы если работает только один поток, то весь...

Странный результат выполнения нескольких потоков
internal class Program { private static void Main() { int numTasks = 20; var state...

6
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
04.01.2019, 04:30
Цитата Сообщение от NatiF Посмотреть сообщение
Поток thread2 не запускается на исполнение, пока не отработает thread1. Как сделать так, чтобы thread1 и thread2 работали одновременно?
С чего вы взяли? Должны работать одновременно.
0
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.01.2019, 13:54  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
С чего вы взяли? Должны работать одновременно.
Хорошо, вот полный код:

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
namespace dLife2
{
    public partial class dLIFE : Form
    {
        public dLIFE()
        {
            InitializeComponent();
        }
        void Replicate(List <char> DNA_father)                             // функция 1 - репликатор
        {
            Thread thread1 = new Thread(mainTHREAD);                // инициализация первого потока
               thread1.IsBackground = false;
                 thread1.Start(DNA_father);
            Thread thread2 = new Thread(mainTHREAD);               // инициализация второго потока
               thread2.IsBackground = false;
                 thread2.Start(DNA_father);
        }
        void mainTHREAD(object data)                               // главная функция потоков
        {
            
                List <char> DNA_son=(List <char>) data;
            string mes="";
            Random rand = new Random();
              DNA_son.Add((char)rand.Next(0x0041, 0x005A));        
            for (int i = 0; i < DNA_son.Count; i++)
                
            mes = mes + DNA_son[i];
            MessageBox.Show(mes);
               //System.Threading.Thread.Sleep(10000);
            
                Replicate(DNA_son);                                   
        }
        
 
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            List<char> DNA_first = new List<char>();               
                DNA_first.Add('A');                                 
                  Replicate(DNA_first);                                 
                 
                    
        }
Программа должна работать так: из основного потока вызывается функция (функция 1), которая создает 2 потока. Функция каждого из этих потоков вызывает в свою очередь функцию 1 и все повторяется и так до бесконечности. Т.о. из одного потока должно получаться 2, из 2 - 4, из 4 - 8 и т.д. Чтобы проверить корректность работы я ввел туда некоторый "код ДНК" в виде List, который дополняется каждым из потоков одним случайным символом, при этом самый первый символ задан, как "А".

Если бы все работало правильно, то я видел бы при запуске 2 окна с двумя разными кодами: AX и AS, например... затем 4 окна AXY, AXO... ASE,ASP... и т.д. Однако, у меня срабатывает так: всегда есть сначала 2 окна с кодом, где первый символ всегда А, а второй - случайный..но цепочка продолжается так, как будто срабатывает только один поток: т.е. AX, AXY, AXYO и т.д. - т.е. нет даже второй ветки. Отсюда я делаю вывод, что работает только первый поток.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
04.01.2019, 15:12
NatiF, ты похоже забыл что List<T> это ссылочный тип и значит все потоки работают с одним и тем же списком. Здесь же похоже предполагается что списки должны быть разные.
C#
1
2
3
4
5
6
7
8
9
        void Replicate(List <char> DNA_father)                             // функция 1 - репликатор
        {
            Thread thread1 = new Thread(mainTHREAD);                // инициализация первого потока
            thread1.IsBackground = false;
            thread1.Start(new List<char>(DNA_father));
            Thread thread2 = new Thread(mainTHREAD);               // инициализация второго потока
            thread2.IsBackground = false;
            thread2.Start(new List<char>(DNA_father));
        }
Добавлено через 14 минут
Еще один момент. Тип List<T> потоко-небезопасен. Обращение к нему из разных потоков необходимо синхронизировать. Отсутствие синхронизации к списку к твоем коде означает что в нем есть потенциальный баг который просто не успел проявится.
1
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.01.2019, 16:37  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
NatiF, ты похоже забыл что List<T> это ссылочный тип и значит все потоки работают с одним и тем же списком. Здесь же похоже предполагается что списки должны быть разные.
Точняк. Спасибо

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Обращение к нему из разных потоков необходимо синхронизировать.
Через lock нормально будет?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
04.01.2019, 16:47
Цитата Сообщение от NatiF Посмотреть сообщение
Через lock нормально будет?
Да.

Добавлено через 6 минут
Еще один момент. Сейчас в коде отсутствует ограничение на количество созданных потоков. Если убрать MessageBox и запустить его, то он быстро достигнет предела по количеству потоков в одном процессе. Это ~1000 на x86 и примерно ~2000 на x64. Необходимо предусмотреть ограничение и вообще задуматься нужно ли в самом деле создавать столько потоков.
1
75 / 9 / 1
Регистрация: 07.06.2016
Сообщений: 132
04.01.2019, 22:16  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Необходимо предусмотреть ограничение и вообще задуматься нужно ли в самом деле создавать столько потоков.
Спасибо, про ограничение знаю. Я думал оптимизировать это так: "код ДНК" растет с увеличением количества потоков... можно проверять его длину, и останавливать дальнейшую генерацию потоков на определенном значении. Количество потоков мне желательно было бы куда больше, чем 2к, но без оптимизации для работы кода на обычном ПК, увы, не обойтись.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.01.2019, 22:16
Помогаю со студенческими работами здесь

Дождаться полного выполнения пула потоков
У меня пул потоков выполняет сортировку временных файлов: for (int i = 1; i &lt; tempFileCount; i++) { ...

BackgroundWorker, несколько потоков и процент выполнения
Здравствуйте, На форме есть кнопка и label (из примера...

Многопоточное приложение: проблема с параллельностью выполнения потоков
Здравствуйте,прошу помощи у вас по следующему вопросу. у меня есть многопоточное приложение, но проблема в том, что почему-то потоки...

Как стартовать несколько потоков и дождаться их выполнения
привет есть 4 метода хочу стартовать их и дождаться когда они все закончат подскажите как реализовать без изобретаия велосипеда ...

Реализация прогресса выполнения задачи с отдельных потоков
Всем здравствуйте! Опишу более подробно свою проблему, надеюсь большое количества текста не оттолкнёт. Во многих своих...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru