我正在编写一个Windows,它可以在QApplication下运行,也可以在常规的Win32应用程序下运行。我想使用Qt网络类,它需要一个事件循环。
如果运行在常规的Win32 (非Qt )应用程序中,我必须启动一个QThread或QEventLoop,以便Qt网络信号和插槽工作。注意: DLL使用QtWinMigrate。但是,如果在QApplication中运行,就会有一个事件循环,并且不需要启动一个新的QThread。
是否有一种检查现有QEventLoop的方法?
澄清DLL在大型遗留代码库下运行,我的类运行的线程可能是也可能不是QThread。
发布于 2016-01-14 21:40:30
答对Qt 5。
您可以通过调用静态函数QThread来获得当前的QThread::CurrentThread。实践告诉我,即使程序中没有QApplication实例,它也返回非空指针。
接下来要做的就是调用QThread::eventDispatcher函数。如果当前线程中没有Qt事件循环,则返回NULL。不幸的是,这个函数只在Qt 5之后才可用。希望在早期版本中还有其他一些方法来获取所需的信息。
顺便说一句,我建议您启动QThread,而不管您的代码是在Qt中运行还是在任何其他事件循环中运行。如果有一种情况,当你需要产卵QThread无论如何,我宁愿总是孕育它。代码少,bug少。
更新:在Qt 4中,您可以使用:
QAbstractEventDispatcher::instance()见文档。
发布于 2021-05-02 09:41:54
int QThread::loopLevel() const返回线程的当前事件循环级别。注意:这只能在线程本身内调用,即当它是当前线程时。该功能是在QT5.5中引入的。
发布于 2016-01-14 20:51:37
来自QThread文档
QThread对象管理程序中的一个控制线程。QThreads开始在run()中执行。默认情况下,()通过调用exec()启动事件循环,并在线程.中运行一个Qt事件循环。
因此,当您调用run时,它有一个事件循环。
https://stackoverflow.com/questions/34799286
复制相似问题