| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Проблема с многопоточностью |
| Автор: bobadd 14.11.2007, 18:57 | ||
| Проблема следующая. Делаю достаточно большую прогулину, необходимо чтобы на заднем плане в одной из закладок программа считывала данные с COM-порта. Создал объект static BackgroundWorker bw = new BackgroundWorker(); Пока конечно не стал делать считывалку с ком-порта. Пока я убедился в том, что действительно работает на заднем плане второй поток. Но наткнулся на проблему, не могу вернуть данные назад в мою форму. Т.е. считать то я считаю с com-порта, а чтобы вывести данные, например, в RichTextBox в главной форме... вообщем тут возникла проблема. Вот примерный код
Вообщем суть проблемы в том, что мне из bw_DoWork нужно как-то добраться до Form1. Собственно говоря, мне нужно добраться до sender'a, насколько я понимаю. Только вот как? Подскажите пожалуйста |
| Автор: tol05 14.11.2007, 19:37 | ||
| Не очень понятно что значит "добраться". Если нужен доступ к WinForms контролу (или форме, не важно), то нужно использовать механизм Invoke. Это уже неоднократно обсуждалось... Нужно поиском по сайту пользоваться просто. для примера, допустим что нужно из bw что-то записывать в
|
| Автор: ivashkanet 14.11.2007, 20:04 |
| tol05, нее, BW настолько грамотный контрол (он действительно контрол, а не просто класс), что никакие инвоки ему не нужны. У него есть еще несколько событий (кроме DoWork), вот одно из них и позволяет передавать данные из потока "наружу". Вот http://forum.vingrad.ru/index.php?show_type=forum&showtopic=124690&kw=progressbar&hl=progress пример кода работы с Воркером (где-то на форуме была ссылка на неплохую RSDN-овскую статью про него). Добавлено через 1 минуту и 47 секунд Нашел: http://www.rsdn.ru/article/dotnet/WinForms20.xml |
| Автор: tol05 14.11.2007, 20:08 | ||||
| ну не знаю... я вообще-то принципиальный противник воркера, уже заявлял об этом.. Но вот я убрал Invoke и вот что получил
код
|
| Автор: 1stain 14.11.2007, 20:54 | ||
| tol05, потому что DoWork() работает таки в другом потоке, а зато если BW кинет мессадж, а форма его перехватит - то все будет Ок. Попробуй так:
то есть BW через метод ReportProgress может кинуть форме сообщение, в аргумент которого засунет что захочет, а форма этот мессадж перехватит и обработает... 2ТС: сделай так, чтобы BW читал данные из com, если надо - обрабатывал и через посылал их во 2-м аргументе метода ReportProgress форма подписывается на событие BW ProgressChanged, приводит ProgressChangedEventArgs.UserState к нужному типу и дальше делай с этими данными на форме что хочешь... |
| Автор: bobadd 14.11.2007, 22:44 |
| Спасибо всем огромное, завтра приду на работу обязательно попробую! |
| Автор: tol05 14.11.2007, 23:44 |
| 1stain, да я как бы знал, что в другом потоке просто не юзаю ProgressChanged event (потому как я - "старообрядец" ) С воркером не разгуляешься. Приходится за каждым чихом менять код менять то в бизнес-слое, то слое представления... Это плохо... Потому как расчитан он на выполнение отвязанных от слоя представления (UI) узких задач, а для связи - немного в нем заложено... ProgressChanged event да его аргумент. Да и вопрос стоял так, чтобы обратиться к контролу из потока воркера. "Обратится" - понятие растяжимое, сегодня значит одно, а завтра может другое. Может завтра данные и не нужно будет передавать, может контролы дизейблить или даже новые создавать завтра нужно будет. К чему тогда ProgressChanged пришивать будем? Я - сторонник простых потоков и инвоков. |