【问题标题】:QTimer, QThread, and TCP messagingQTimer、QThread 和 TCP 消息传递
【发布时间】:2012-06-03 23:11:13
【问题描述】:

Qt 4.8,Windows XP:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: qthread


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 这个答案可能挽救了我的工作,不开玩笑!你能告诉我这是否仍然适用于 Qt5 吗?另外,您能否详细说明一下文档中描述的位置?谢谢!
    • 其实我发现QTimer并没有继承Qt5中线程父级的cotext(我不知道Qt4.x)。但是您必须确保 QTimer 与 worker 对象一起移动,方法是使其成为 worker 的子对象或在新上下文中创建它。看到这个有用的帖子:qt-project.org/forums/viewthread/21141
    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2012-05-16
    • 2013-10-15
    • 2017-06-05
    • 2010-10-20
    相关资源
    最近更新 更多