0

Qt 4.8,Windows XP:

我有一个线程来管理我的 TCP 消息并在适当的时间打开/维护/关闭套接字。

这个相同的线程启动一个 QTimer,200 毫秒,在我的线程数据中定义,一旦(如果)套接字打开,它就会在我的线程类中泵出一个事件。所以计时器及其事件属于线程,据我所知,这个想法是最好的。

QTimer 超时事件通过属于线程的端口发送一条 TCP 消息,它是此特定硬件项目的保持活动消息。必须定期发送,否则设备会“消失”,这是不行的。

发送消息时,我收到此错误:

“QSocketNotifier:不能从另一个线程启用套接字通知”

据我所知,我同一个线程发送消息,并期望任何信号等都由它拥有/处理等。

谁能告诉我我在这里缺少什么?

PS:消息发送,设备确实保持活动状态...只是我在 Qt 错误控制台上收到此运行时错误,我非常担心因此而潜伏的内部问题。

在 OS X 10.6 下运行时不会出现该消息。我不知道为什么。

4

1 回答 1

3

好的,这是独家新闻。QTimer,因为只有 QT 的设计者才知道,它继承了线程父级的上下文。不是它启动的线程的上下文。因此,当计时器关闭,并且您从它调用的插槽发送消息时,您不在线程的上下文中,而是在父上下文中。

您也无法启动该线程的子线程,以便您可以触发实际上将在您想要的线程中的计时器。Qt 不会让它运行。

因此,花费一些内存,创建一个队列,将消息从其他地方加载到队列中,在拥有 TCP 端口的线程中观察队列,并在收到它们时发送它们。这样可行。

于 2012-05-30T01:58:39.393 回答