![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| bobadd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 14.11.2007 Репутация: нет Всего: нет |
Проблема следующая. Делаю достаточно большую прогулину, необходимо чтобы на заднем плане в одной из закладок программа считывала данные с COM-порта.
Создал объект static BackgroundWorker bw = new BackgroundWorker(); Пока конечно не стал делать считывалку с ком-порта. Пока я убедился в том, что действительно работает на заднем плане второй поток. Но наткнулся на проблему, не могу вернуть данные назад в мою форму. Т.е. считать то я считаю с com-порта, а чтобы вывести данные, например, в RichTextBox в главной форме... вообщем тут возникла проблема. Вот примерный код
Вообщем суть проблемы в том, что мне из bw_DoWork нужно как-то добраться до Form1. Собственно говоря, мне нужно добраться до sender'a, насколько я понимаю. Только вот как? Подскажите пожалуйста |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Не очень понятно что значит "добраться". Если нужен доступ к WinForms контролу (или форме, не важно), то нужно использовать механизм Invoke. Это уже неоднократно обсуждалось... Нужно поиском по сайту пользоваться просто.
для примера, допустим что нужно из bw что-то записывать в
-------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
tol05, нее, BW настолько грамотный контрол (он действительно контрол, а не просто класс), что никакие инвоки ему не нужны.
У него есть еще несколько событий (кроме DoWork), вот одно из них и позволяет передавать данные из потока "наружу". Вот тут пример кода работы с Воркером (где-то на форуме была ссылка на неплохую RSDN-овскую статью про него). Добавлено через 1 минуту и 47 секунд Нашел: http://www.rsdn.ru/article/dotnet/WinForms20.xml |
|||
|
||||
| tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
ну не знаю... я вообще-то принципиальный противник воркера, уже заявлял об этом..
Но вот я убрал Invoke и вот что получил
код
-------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
| 1stain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 486 Регистрация: 30.7.2007 Где: Киев - Харьков Репутация: 8 Всего: 40 |
tol05, потому что DoWork() работает таки в другом потоке, а зато если BW кинет мессадж, а форма его перехватит - то все будет Ок.
Попробуй так:
то есть BW через метод ReportProgress может кинуть форме сообщение, в аргумент которого засунет что захочет, а форма этот мессадж перехватит и обработает... 2ТС: сделай так, чтобы BW читал данные из com, если надо - обрабатывал и через посылал их во 2-м аргументе метода ReportProgress форма подписывается на событие BW ProgressChanged, приводит ProgressChangedEventArgs.UserState к нужному типу и дальше делай с этими данными на форме что хочешь... Это сообщение отредактировал(а) 1stain - 14.11.2007, 21:00 -------------------- Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein) ![]() |
|||
|
||||
| bobadd |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 14.11.2007 Репутация: нет Всего: нет |
Спасибо всем огромное, завтра приду на работу обязательно попробую!
|
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
1stain, да я как бы знал, что в другом потоке
просто не юзаю ProgressChanged event (потому как я - "старообрядец" ) С воркером не разгуляешься. Приходится за каждым чихом менять код менять то в бизнес-слое, то слое представления... Это плохо... Потому как расчитан он на выполнение отвязанных от слоя представления (UI) узких задач, а для связи - немного в нем заложено... ProgressChanged event да его аргумент. Да и вопрос стоял так, чтобы обратиться к контролу из потока воркера. "Обратится" - понятие растяжимое, сегодня значит одно, а завтра может другое. Может завтра данные и не нужно будет передавать, может контролы дизейблить или даже новые создавать завтра нужно будет. К чему тогда ProgressChanged пришивать будем? Я - сторонник простых потоков и инвоков. Это сообщение отредактировал(а) tol05 - 15.11.2007, 02:46 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |