我正在编写一个 Windows DLL,它可以在 QApplication 下运行,也可以在常规 Win32 应用程序下运行。我想使用需要事件循环的 Qt Networking 类。
如果在常规 Win32(非 Qt)应用程序中运行,我必须启动 QThread 或 QEventLoop 以使 Qt 网络信号和槽工作。 注意:DLL 使用 QtWinMigrate。 但是如果运行在一个QApplication中,已经有一个事件循环,不需要启动一个新的QThread。
有没有办法检查现有的 QEventLoop?
澄清 DLL 在大型遗留代码库下运行,我的类运行的线程可能是也可能不是 QThread。
最佳答案
Qt 5 的回答。
你可以通过调用静态函数来获取当前的QThread
QThread::CurrentThread
.实践告诉我,即使您的程序中没有 QApplication
实例,它也会返回非空指针。
接下来要做的是调用 QThread::eventDispatcher
功能。如果当前线程中没有 Qt 事件循环,它返回 NULL
。不幸的是,此功能仅在 Qt 5 之后可用。希望在早期版本中有一些其他方法可以获取所需的信息。
顺便说一句,无论您的代码是在 Qt 还是任何其他事件循环中运行,我都建议您启动 QThread
。如果在某种情况下您无论如何都需要生成 QThread
,我宁愿始终生成它。更少的代码,更少的错误。
更新:在 Qt 4 中,您可以使用:
QAbstractEventDispatcher::instance()
参见 doc .
关于c++ - 我可以确定线程是否具有 QEventLoop 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34799286/