我可以确定一个线程是否有QEventLoop吗?

时间:2016-01-14 20:38:52

标签: c++ qt

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

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

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

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

3 个答案:

答案 0 :(得分:8)

回答Qt 5。

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

接下来要做的就是致电QThread::eventDispatcher  功能。如果当前线程中没有Qt事件循环,则返回NULL。不幸的是,这个功能仅在Qt 5开始提供。希望在早期版本中有其他方法可以获得所需的信息。

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

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

QAbstractEventDispatcher::instance()

请参阅doc

答案 1 :(得分:1)

int QThread::loopLevel() const

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

答案 2 :(得分:0)

来自QThread docs

  

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

因此,当您致电run时,它会有一个事件循环。