2012-05-29 3 views
0

Qt 4.8, Windows XP:QTimer, QThread и TCP сообщения

У меня есть поток, который управляет моим TCP сообщением и открывает/сохраняет/закрывает сокет в нужное время.

Эта же нить запускает QTimer, 200 мс, определенный в данных моего потока, который накачивает событие в классе моего потока один раз (если), сокет открыт. Таким образом, таймер и его событие относятся к потоку, насколько я понимаю идею.

Событие тайм-аута QTimer отправляет TCP-сообщение через порт, принадлежащий потоку, это сообщение keep-alive для данного конкретного элемента аппаратного обеспечения. Должно быть отправлено регулярно или устройство «уходит», что не будет сделано.

Когда сообщение отправлено, я получаю эту ошибку:

«QSocketNotifier: гнездо оповещатели не могут быть включены из другого потока»

Насколько я могу сказать, я утро посылая сообщение от тот же поток и будет ожидать, что любые сигналы и т. д. будут принадлежать/обрабатываться и т. д. им.

Может ли кто-нибудь сказать мне, что мне здесь не хватает?

PS: Сообщение отправляется, устройство делает остаться в живых ... это просто, что я получаю эту ошибку во время выполнения на консоли ошибок Qt, и я очень обеспокоен тем, что есть внутренние проблемы, скрывающиеся из-за этого.

Сообщение не выполняется под управлением OS X 10.6. Я не знаю почему.

ответ

3

Хорошо, вот совок. QTimer, по причинам, известным только разработчикам QT, наследует контекст родителя потока. Не контекст потока, из которого он запускается. Поэтому, когда таймер отключается, и вы отправляете сообщение из слота, который он вызывал, вы не в контексте потока, вы находитесь в контексте родителей.

Вы также не можете запустить поток, который является дочерним потоком THAT, чтобы вы могли запускать таймер, который действительно будет в нужном вам потоке. Qt не позволит запустить.

Итак, потратьте немного памяти, сделайте очередь, загрузите сообщение в очередь из другого места, посмотрите очередь в потоке, который владеет портом TCP, и отправьте их, когда вы получите их. Это работает.

+0

+1 Этот ответ, возможно, сохранил мою работу, не шучу! Не могли бы вы рассказать мне, сохраняется ли это в Qt5? И, также, не могли бы вы рассказать о том, где в документации это описано? Благодаря! –

+0

На самом деле, я обнаружил, что QTimer не наследует cotext родителя потока в Qt5 (я не знаю о Qt4.x). Но вы должны убедиться, что QTimer перемещается вместе с рабочим объектом, сделав его дочерним элементом рабочего или создавая его в новом контексте. См. Этот полезный пост: http://qt-project.org/forums/viewthread/21141 –

Смежные вопросы