我正在编写一个可以在QApplication下运行的Windows DLL,或者可以在常规的Win32应用程序下运行。我想使用需要事件循环的Qt Networking类。
如果在常规的Win32(非Qt)应用程序中运行,我必须为Qt网络信号和插槽启动QThread或QEventLoop才能工作。 注意:DLL使用QtWinMigrate。 但是如果在QApplication中运行,则会有一个事件循环,而不需要启动新的QThread。
有没有办法检查现有的QEventLoop?
澄清 DLL在大型遗留代码库下运行,我的类运行的线程可能是也可能不是QThread。
答案 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
时,它会有一个事件循环。