| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Разработка Windows Forms > Контролы и Потоки |
| Автор: DenwerD 7.5.2008, 08:01 |
| Здравствуйте, господа. Возникла проблема, надеюсь поможете разобраться. Исходные данные: Есть Windows Форма, на ней ListBox. Есть приложение UdpServer (собственный класс). UdpServer исполняется в главном потоке в месте с формой. UdpServer агрегирует несколько объектов класса UdpListener у которых есть метод Start. Метод Start каждого объекта UdpListener исполняется в отдельном потоке, которые запускает UdpServer. При вызове UdpListener.Start() генерируется событие onStart(string msg), обработчиком которого является метод UdpServer.item_Start(msg), который в свою очередь генерирует событие onServerItemStart (msg) обработчиком которого является метод формы Form1.onUdpServerItemStart(msg). onUdpServerItemStart(msg) - должен тупо добавлять в ListBox строку msg и все, но когда он пытается сделать - возникает исключение, цитирую : "Cross-thread operation not valid: Control 'logBox' accessed from a thread other than the thread it was created on." Вопрос: 1. Почему так происходит т.е. Что я не верно длаю? 2. Как можно этого исбежать? Заранее благодарю. |
| Автор: amarenkov 7.5.2008, 08:08 |
| DenwerD(, поищи на слово Invoke(). Ты должен менять контролы в том потоке, в котором они созданы. Об этом и ошибка. У каждого контрола есть метод Invoke(), выполняющий аргумент в потоке-создателе компонента. P.S. Щас тебя заклюют сообщениями: "Надо поиском пользоваться" |
| Автор: DenwerD 7.5.2008, 08:26 | ||
Получается что метод(исполняемый в потоке "a") генерирует событие, а обработчик этого события так же исполнится в этом потоке ("а")? Правильно я понимаю? |
| Автор: DenwerD 7.5.2008, 08:42 |
| amarenkov, спасибо тебе за подсказку, проблему решил |