Организация программы, доступ к компонентам из thread.

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

cpl
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.05.2008 (Ср) 18:39

Организация программы, доступ к компонентам из thread.

Сообщение cpl » 16.07.2008 (Ср) 14:40

Есть задача принимать данные по сети или uart, есть подпрограммы событий пришли данные, в них производится обработка данных с выводом результатов в TextBox или PictureBox но тут оказывается нельзя обратиться к TextBox или PictureBox софт слетает, критическая ошибка

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll
Additional information: Cross-thread operation not valid: Control 'tbLog' accessed from a thread other than the thread it was created on. !

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

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

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 16.07.2008 (Ср) 14:53

Form.Invoke
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Сообщение Williams » 16.07.2008 (Ср) 18:54

cpl

Не вдавался в подробности, но на первый взгляд приходит следующее:

Можно использовать репорт из BackGroundWorker'а (событие отчетов вызывается из основного потока). Можно передавать объект UserState, а это что угодно...

Второе, можно использовать делегат и, как сказал ANDLL, делать инвокацию своей формы. Идея такая, в процедуре, где происходит доступ к элементам управления созданным в другом потоке нужно как бы "перенаправить" вызов на саму себя через делегат, но это уже будет вызов из "правильного" потока. В MSDN есть примеры на этот счет.



Можно также отключить проверку на неправильную "Cross-Threaded" операцию - в корневом пространстве имен имеется соответствующая переменная типа Boolean (CheckForIllegalCrossThreadCalls). Но этого делать не рекоммендуется :)


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList