Как избежать использования таймера при использовании TThread для связи с потоком пользовательского интерфейса - PullRequest
0 голосов
/ 08 декабря 2009

У меня есть TThread, который получает и отправляет на устройство через COM-порт. После того, как я прочитал данные, я хочу активировать GUI (не в том же потоке), используя Synchronize (имя функции). Однако, когда я вызываю функцию формы графического интерфейса для выполнения нажатия кнопки, я получаю нарушение прав доступа. Я проверил, является ли значение формы нулевым, и это не так, поскольку это было бы очевидной причиной нарушения доступа. Прямо сейчас я устанавливаю глобальные флаги и использую таймер, который постоянно проверяет, удовлетворяется ли определенное условие, и если да, то я запускаю событие нажатия кнопки в этой форме. Кажется, это единственный способ избежать нарушения прав доступа.

Мне действительно не нравятся таймеры, так есть ли способ избежать использования таймера в форме?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2009

Я нашел проблему. Я думал, что проверял, была ли моя Форма нулевой, но я не был. Я исправил это, убедившись, что форма, на которую я ссылался, не null.

Edit: Оказывается, что одна из форм, которая вызывается, когда я вызываю Fbutton1Click (), является модальной, поэтому она блокирует мой поток. Я прекратил возвращаться к таймеру, чтобы вместо этого вызывать нажатие кнопки ... да ладно.

0 голосов
/ 08 декабря 2009

Вы можете отправить сообщение в соответствующее окно. Таймер работает аналогичным образом. Он просто запускает сообщение Windows внутри формы. У тебя явно есть ручка к окну.

CWnd :: PostMessage (...) Не используйте отправленное сообщение, оно обрабатывается встроенным и может привести к прекращению работы вашего потока.

Обычно, когда у вас есть рабочий поток, который пытается получить доступ к Guithread, они конфликтуют. Прошло много времени с тех пор, как я использовал MFC и многопоточность, но это то, что я помню. Я полагаю, что это документально подтверждено.

...