9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
|
1 | |
Недопустимая операция в нескольких потоках03.01.2018, 02:01. Показов 1549. Ответов 13
Метки нет Все метки)
(
1. Есть класс MyClass в котором метод MyMethod каждую секунду увеличевает переменную на a 1 и TestEvent - событие которое срабатывает через каждую секунду и передаеет в своем аргументе значение переменной а
2. Создаю экземпляр класса и вызываю его метод в новом потоке, также создаю его событие которому назначаю мутод в котором пишу progressBar1.Value = progress; и у меня выбивает ошибка я понял что сообщенный метод с TestEvent - пренадлежит вторичном потоку (хотя вроде бы находится в первичном на первый взгляд). Я со вторичного потока обращаюсь к элементу progressBar1 который относится к первичному. Вот и ошибка. А Как мне быть? Помогите пожалуйста. Как сделать что бы прогрессБар получал значения с вторичного потока и отображал его. Его как то надо добавить в контекст Вторичного потока?
0
|
|
03.01.2018, 02:01 | |
Ответы с готовыми решениями:
13
Недопустимая операция в нескольких потоках
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
||||||
03.01.2018, 02:35 [ТС] | 2 | |||||
Код программы
0
|
1216 / 1004 / 259
Регистрация: 15.06.2012
Сообщений: 3,888
|
||||||
03.01.2018, 02:52 | 3 | |||||
https://msdn.microsoft.com/ru-... .110).aspx
https://msdn.microsoft.com/ru-... .110).aspx
0
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
|
03.01.2018, 21:26 [ТС] | 4 |
немогу устранить ошибку. игразся с точкой и запятой, так и непонял куда ее тулить
0
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
|
03.01.2018, 21:30 [ТС] | 5 |
0
|
1147 / 739 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
|
||||||
03.01.2018, 23:39 | 6 | |||||
Sayanchik777,
1
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
|
04.01.2018, 00:28 [ТС] | 7 |
Получается хоть и тело метода TestClass_TestEvent находится в в основному потеке- оно пренадлежит вторичном потоку. С вторичного потока нет доступа к прогресбару.progressBar1.BeginInvoke - второй поток говорит первому запусти прогрес с значением progress?
Добавлено через 1 минуту private void TestClass_TestEvent(int progress) { Переменная int какому потоку пренадлежит?
0
|
![]() |
|
04.01.2018, 12:09 | 8 |
![]() Решение
Нет. Главное - из какого потока вызывается метод, в том он и выполняется.
Доступ есть, но контролы не приспособлены к такой работе, когда их методы вызываются из разных потоков. Программа упадёт. Делегат метода передаётся в очередь сообщений, в которой работает указываемый контрол, и оттуда вызывается (как очередь до него дойдёт). Непродуманное применение такого способа может легко привести к переполнению очереди ненужными сообщениями. Что приведёт к постепенному торможению программы, а то и к падению, если указываемый контрол к моменту выполнения делегата уже будет уничтожен. Ни к какому.
1
|
9 / 9 / 6
Регистрация: 09.05.2015
Сообщений: 524
|
|
04.01.2018, 18:40 [ТС] | 9 |
Безопасние выполнять в первом потоке какойто метод, тело которого будет переприсваевать значение прогрем бару (таймером например). это будет более безопастние?
0
|
1216 / 1004 / 259
Регистрация: 15.06.2012
Сообщений: 3,888
|
|
04.01.2018, 19:44 | 10 |
Sayanchik777, в WinForms есть TimerControl, который уже выполняет действия в нужном потоке.
Rius, чисто проорать -- а как разруливается MVVM с разными потоками?
0
|
1216 / 1004 / 259
Регистрация: 15.06.2012
Сообщений: 3,888
|
|
04.01.2018, 20:59 | 12 |
Rius,
я малость не про то: - создаем модель, реализуем интерфейс IChangeProperty ( или как его там) - привязываем значение поля к значению контрола. - меняем значение модели в другом потоке. Лично у меня без инвоков завалилось (окей, понятно), но появляется вопрос -- как адекватно разрешить вопрос привязки? Получается либо модель должна знать в каком потоке бросать ивент, либо мы контролировать действия с моделью в правильном потоке.
0
|
TheGreatCornholio
1249 / 727 / 285
Регистрация: 30.07.2015
Сообщений: 2,403
|
|
04.01.2018, 21:59 | 14 |
Если лениво совсем, можно так попробовать.
https://msdn.microsoft.com/ru-... .110).aspx
0
|
04.01.2018, 21:59 | |
Помогаю со студенческими работами здесь
14
Недопустимая операция в нескольких потоках Асинхронные потоки. Недопустимая операция в нескольких потоках Доступ к ProgressBar. Недопустимая операция в нескольких потоках Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |