0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
||||||
1 | ||||||
Проблема с потоками23.02.2019, 04:07. Показов 3478. Ответов 17
Метки нет (Все метки)
Проблема заключается в том, что создается только один поток, а мне нужно 3 потока.
0
|
23.02.2019, 04:07 | |
Ответы с готовыми решениями:
17
Проблема с потоками. Проблема с потоками проблема с потоками Проблема с потоками |
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 08:12 | 2 |
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 10:49 [ТС] | 3 |
asn31337, на основании того, что вывожу номер текущего потока, а он всегда равен одному
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 11:28 | 4 |
Неверная у Вас логика))) Дело в том, что у Вас в цикле открывается форма в режиме диалога. Пока форма не будет закрыта, новая итерация не начнется. Тем временем поток завершает свою работу и на новой итерации стартует с тем же номером. Попробуйте открывать форму не модально. По идее, должно открыться 3 формы, каждая из которых будет отработана своим потоком.
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 11:32 [ТС] | 5 |
asn31337, То есть, вы предлагаете использовать Task.run?Просто, если использовать его, то работает все в отдельных потоках, но мне казалось, что есть другие способы
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 11:34 | 6 |
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 11:37 [ТС] | 7 |
asn31337, Если так, то все также один поток все обрабатывает
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 11:43 | 8 |
Значит, просто работа потока занимает очень мало времени и к моменту второй итерации поток уже отрабатывает (попробуйте искусственно затормозить работу метода, который выполняется в потоке, например, Thread.Sleep).
А в чем принципиальность именно 3-х потоков?
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 11:46 [ТС] | 9 |
asn31337, Мне нужно, чтобы каждый из потоков обрабатывал свой полином n-ой степени, то есть 2-ой поток обрабатывает вторую степень и так далее.Мне нужно как-то синхронизировать их работу с помощью ManualResetEvent или AutoResetEvent
Добавлено через 57 секунд asn31337, И еще, я заметил, что если использовать просто Show, то форма не может загрузится, просто белое окно.Так что, это не выход :C
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
||||||
23.02.2019, 11:57 | 10 | |||||
Сообщение было отмечено artur31154 как решение
Решение
artur31154, чет я сразу то не обратил внимание... Вы номер выводите всегда для основного потока))) Чтобы вывести номер запущенного перенесите строку
только что проверил, все норм работает. если не грузится форма, значит где то в коде косяк.
1
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 12:02 [ТС] | 11 |
asn31337, Так, больше Вам спасибо!.И еще, можно как-то синхронизировать эти потоки с помощью autoResetEvent или ManualResetEvent?
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 12:18 | 12 |
Сообщение было отмечено artur31154 как решение
Решение
А в чем должна заключаться синхронизация? Эвенты просто имеют 2 состояния - сигнальное и несигнальное. Т.е. можно, к примеру, послать сигнал и поток будет приостановлен до получения сигнала. Под синхронизацией обычно подразумевается использование несколькими потоками одной и той же переменной. Если все потоки только читают ее, то синхронизация вообще не нужна. Если же возможно изменение значения переменной во время работы потока, то используют lock, mutex или семафоры.
1
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
||||||
23.02.2019, 12:51 [ТС] | 13 | |||||
asn31337, asn31337, чтобы каждый поток выполнялся по-очереди строго
Добавлено через 26 минут asn31337, В общем, с синхронизацией потоков с помощью события я вроде бы разобрался.Теперь проблема с Show, она отображается белое окно, которое даже закрыть нельзя с помощью крестика.Вот код:
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 12:56 | 14 |
А зачем тогда вообще нужно несколько потоков, если они все равно должны работать по-очереди?
Ну, если очень хочется... Тогда примерно так должно быть: 1. Надо создать 2 глобальных переменных типа ManualResetEvent (обе в несигнальном состоянии). 2. Создаем и запускаем все 3 потока, но во 2-м и 3-м первой строкой ждем сигнального состояния ManualResetEvent. 3. по завершении 1-го потока устанавливаем 1-ю переменную в сигнальное состояние - начинает выполняться второй поток 4. по завершении 2-го потока устанавливаем 2-ю переменную в сигнальное состояние - выполняется 3-й поток. Это очень примерно, так сказать набросок...
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 13:01 [ТС] | 15 |
asn31337, я это смог реализовать, теперь проблема в форме, так как мне нужно, чтобы сразу отобразились все формы n-ой степени поочереди, поэтому для этого целесобразно использовать Show(), но он почему-то не работает у меня, понять не могу.А ShowDialog не подходит, так как он блокирует все остальные формы и они не выводятся, пока не закроешь эту форму
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
|
23.02.2019, 13:17 | 16 |
переменная находится в несигнальном состоянии и ее значение нигде не меняется. получается код доходит до строки
и "зависает" в ожидании сигнала... Добавлено через 1 минуту Возможно, дело не только в этом, но это тоже косяк))) Добавлено через 9 минут И, кстати, не очень понял... Form1 - это единственная форма или еще есть? Приложение как запускается?
0
|
0 / 0 / 0
Регистрация: 09.10.2018
Сообщений: 115
|
|
23.02.2019, 14:14 [ТС] | 17 |
asn31337, да, это единственная форма,а запускается она через консольное приложение в методе main
Добавлено через 52 минуты asn31337, А зачем тогда вообще нужно несколько потоков, если они все равно должны работать по-очереди? Ну, если очень хочется... Тогда примерно так должно быть: 1. Надо создать 2 глобальных переменных типа ManualResetEvent (обе в несигнальном состоянии). 2. Создаем и запускаем все 3 потока, но во 2-м и 3-м первой строкой ждем сигнального состояния ManualResetEvent. 3. по завершении 1-го потока устанавливаем 1-ю переменную в сигнальное состояние - начинает выполняться второй поток 4. по завершении 2-го потока устанавливаем 2-ю переменную в сигнальное состояние - выполняется 3-й поток. Это очень примерно, так сказать набросок... А можете подробнее описать?
0
|
Фрилансер
805 / 312 / 148
Регистрация: 13.02.2019
Сообщений: 1,071
|
||||||
23.02.2019, 20:06 | 18 | |||||
Сообщение было отмечено artur31154 как решение
Решение
Навскидку:
0
|
23.02.2019, 20:06 | |
23.02.2019, 20:06 | |
Помогаю со студенческими работами здесь
18
Проблема с потоками Проблема с потоками (файлы) Проблема при работе с потоками Проблема с широкими потоками(wofstream) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |