Qt 4.8,Windows XP:
我有一个管理我的TCP消息的线程,并在适当的时候打开/维护/关闭套接字。
这个相同的线程启动一个QTimer,200毫秒,在我的线程数据中定义,它在我的线程的类中抽一个事件(如果)套接字打开。所以计时器及其事件属于线程,我最好理解这个想法。
QTimer超时事件通过属于该线程的端口发送TCP消息,它是该特定硬件项的保持活动消息。必须定期发送或设备“消失”,这是不会做的。
发送邮件时,我收到此错误:
“QSocketNotifier:无法从另一个线程启用套接字通知程序”
据我所知,我是从同一个线程发送消息,并希望由它拥有/处理任何信号等。
谁能告诉我这里缺少什么?
PS:发送消息 ,设备 保持活着...这只是我在Qt错误控制台上得到这个运行时错误而且我'我非常担心因为它而潜伏着内部问题。
在OS X 10.6下不会运行该消息。我不知道为什么。
答案 0 :(得分:3)
好的,这是独家新闻。由于QT的设计者只知道QTimer,因此继承了线程父级的上下文。不是从它发起的线程的上下文。所以当计时器关闭,并且你从它调用的插槽发送一条消息时,你不在线程的上下文中,你在父母的上下文中。
您也无法启动该线程的子线程,因此您可以触发实际位于所需线程中的计时器。 Qt不会让它运行。
因此,花费一些内存,建立队列,从其他地方将消息加载到队列中,在拥有TCP端口的线程中查看队列,并在获得em时发送em。这很有效。