【问题标题】:How to combine own message loop and Qt event loop?如何结合自己的消息循环和Qt事件循环?
【发布时间】:2012-10-24 17:00:34
【问题描述】:

我有一个派生自QThread: class MyClass : public QThread 的类。在运行方法中,我有“我自己的”消息循环:

run() { 
  // exec(); // while not reached    
  while (_runMessageLoop && ...) {
    hr = CallDispatch(.....);
    if (hr== 0) QThread::msleep(100); 
    // QCoreApplication::processEvents(); // Does not work
  }
}

由于exec() 没有被执行,我有no Qt 事件循环。这显然会导致信号/插槽not to work correctly有没有机会将 Qt 和我自己的消息循环结合起来? 或者我是否需要一个频繁触发的计时器来完成我在无限循环中完成的工作?

【问题讨论】:

    标签: qt signals-slots qthread


    【解决方案1】:

    “Qt-wise”的正确方法是使用计时器并让 Qt 管理事件循环。

    如果您需要依赖外部的东西,您可以使用QAbstractSocket 之类的东西在数据通过外部套接字进入时发送事件,例如。

    【讨论】:

    • 运行一个定时器触发频繁的 100 毫秒更新没问题?
    • 但更笼统地说:最好的办法是根据外部触发器确定您需要做什么,如果可能的话,然后改用这些触发器。但是 100 毫秒计时器是否有问题是您需要测试的,因为这取决于您在 这 100 毫秒期间做什么!
    • “您上面的代码已经在这样做了!”。是的,但没有计时器。我担心计时器可能涉及的开销。
    • 我不认为计时器开销会很糟糕。但我很乐意看到这两种实现都经过测试和测量!
    • 我已将我的代码更改为计时器,CallDispatch 现在被封装并由计时器重复调用。信号/插槽问题消失了,我看不到任何可观的开销。但是,我想这涉及到一些小的开销:“作为一种特殊情况,超时为 0 的 QTimer 将在 窗口系统的事件队列中的所有事件都已处理完时超时。 " (QT 独库:doc.qt.digia.com/qt/qtimer.html)。我注意到最大的不同是因为我的 Dispatch 现在在 GUI 线程中运行(对吗?),使输出更容易。
    【解决方案2】:

    这并不是正确实现事件循环的真正答案,我相当确定有办法,但更多的是一种解决方法:

    正常启动线程,exec() 和所有,并将启动信号连接到一个槽(确保它在正确的线程中被调用),然后将你的循环放在那里,并在该循环中调用 Qt 的 processEvents()。这样可以确保正确设置 Qt 事件循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2021-10-13
      • 2014-10-31
      相关资源
      最近更新 更多