【问题标题】:Can I determine if a thread has a QEventLoop?我可以确定一个线程是否有 QEventLoop 吗?
【发布时间】:2016-01-14 20:38:52
【问题描述】:

我正在编写一个 Windows DLL,它可以在 QApplication 下运行,或者可以在常规 Win32 应用程序下运行。我想使用需要事件循环的 Qt Networking 类。

如果在常规 Win32(非 Qt)应用程序中运行,我必须启动 QThread 或 QEventLoop 才能使 Qt 网络信号和插槽工作。 注意:DLL 使用 QtWinMigrate。 但是如果在QApplication中运行,已经有事件循环了,不需要再启动一个新的QThread。

有没有办法检查现有的 QEventLoop?

澄清 DLL 在大型遗留代码库下运行,运行我的类的线程可能是也可能不是 QThread。

【问题讨论】:

  • 如果需要的话,你真的应该强制 DLL 的用户启动一个线程......
  • 你不能检查QApplication::instance是否存在吗?
  • 似乎所有QThreads 都有一个事件循环,所以这里最大的问题是它是否正在运行。也许isRunning()
  • 我刚刚对问题进行了澄清。 QApplication::instance 存在,因为我们使用的是 QtWinMigrate。但是我的类可能在非 QThread 工作线程中运行并且没有事件循环。这有意义吗?抱歉,我仍在努力解决它。也许没关系,我应该总是启动一个新的 QThread?
  • 有一个函数:bool QEventLoop::isRunning() const,如果事件循环正在运行,返回true;否则返回假。事件循环被认为是从调用 exec() 到调用 exit() 开始运行。 问题是,你能访问事件循环吗?

标签: c++ qt


【解决方案1】:

回答 Qt 5。

你可以通过调用静态函数QThread::CurrentThread获取当前QThread。实践证明,即使您的程序中没有QApplication 实例,它也会返回非空指针。

接下来要做的是致电QThread::eventDispatcher 功能。如果当前线程中没有 Qt 事件循环,则返回 NULL。不幸的是,此功能仅在 Qt 5 之后才可用。希望在早期版本中还有其他一些方法可以获取所需的信息。

顺便说一句,我建议您启动QThread,无论您的代码是在Qt 还是在任何其他事件循环中运行。如果在某种情况下您无论如何都需要生成 QThread,我宁愿始终生成它。更少的代码,更少的错误。

更新:在 Qt 4 中,您可以使用:

QAbstractEventDispatcher::instance()

doc

【讨论】:

  • 这回答了这个问题。由于我现在坚持使用 Qt 4.7,我会听取您的建议并始终创建 QThread。
  • @matthewmyers 无论如何更新了 Qt4。你可以尝试一下。
  • 我想知道是否有线程安全等待(例如等待某个线程进入事件循环)
【解决方案2】:
int QThread::loopLevel() const

返回线程的当前事件循环级别。 注意:这只能在线程本身内调用,即当它是当前线程时。 这个函数是在 Qt 5.5 中引入的。

【讨论】:

    【解决方案3】:

    来自QThread docs

    QThread 对象管理程序中的一个控制线程。 QThreads 在 run() 中开始执行。 默认情况下,run() 启动事件 通过调用 exec() 循环并在线程内运行 Qt 事件循环。

    所以,当你调用run时,它有一个事件循环。

    【讨论】:

    • 据我所知,他在询问线程。与应用程序无关。
    • 这也不对。您可以在没有事件循环的情况下运行。
    • @Michael - 你可以重载QThread 并在最后不调用 exec 的情况下实现 run - 你将拥有一个在没有运行事件循环的情况下运行的线程实例。
    • 谢谢大家,我知道 QThread 启动了一个事件循环,在我的课程运行时,它可能在一个非 QThread 中,我必须启动一个以获得事件循环。
    • 默认并不总是意味着,有很多用例需要线程但不需要事件循环。这是完全合法的使用。如果你重载了QThread,你就实现了run,并且只有在需要时才启动事件循环。
    猜你喜欢
    • 1970-01-01
    • 2012-11-30
    • 2021-11-20
    • 1970-01-01
    • 2011-08-07
    • 2023-03-19
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多