主程序是交互式的吗?如果是,那么它很可能会运行 glib 主事件循环。Qt 在 Linux 上使用相同的事件循环,因此您无需exec()
在代码中调用。QEventLoop
通过创建 的实例、向其发布退出调用并对其进行调用,仅启动一次事件循环exec()
。然后将控制权交还给主程序。您的代码仍将在事件到达时运行(计时器超时、网络数据包到达等)。
exec()
使用 Qt 获得的本机事件循环集成的美妙之处在于,如果其他人已经在旋转循环,则无需执行 main 。
所以,下面是 Linux 上 GTK 应用程序的 Qt 插件的样子:
extern "C" void pluginInit() {
new QApplication;
QEventLoop loop;
QMetaObject::invokeMethod(&loop, "quit", Qt::QueuedConnection);
loop.exec();
}
extern "C" void pluginDestroy() {
delete qApp;
}
一旦插件用户调用pluginInit
,他们可以调用插件中使用 Qt 的任何函数,并且事件将由调用应用程序的事件循环正确处理。
与线程相比,我更喜欢这样的解决方案,因为它通常听起来更稳定。
如果线程对您来说不稳定,那么您做的不对。网络支持将在专用线程上运行良好。它可能是第二个线程为数不多的合法用途之一,因为这样您的网络数据处理就不会因为用户级渲染器和合成器将您在屏幕上看到的内容放在一起而延迟。