我试图扩展一个在Ubuntu/下运行的具有Qt网络支持的旧程序。与这些库进行局域网通信需要运行QEventLoop的QEventLoop才能真正开始工作(即:接受连接、接收、发送等等)。
问题
问题是,我不知道这个事件循环在主程序中的位置,而且由于我对它的设计不太了解,我更喜欢一个尽可能独立的解决方案。
我的想法
我已经检查过了,我不需要主QEventLoop,也可以只为网络(即嵌套)再做一个。不幸的是,我无法弄清楚如何并行运行这两个循环,因为我的程序在嵌套的.exec()上停止,所以主程序也停止了。
所以我的主要意图实际上是用Qt网络扩展主程序,我对其他解决方案也很开放。
发布于 2016-03-11 14:34:02
主程序是交互式的吗?如果是,则很可能运行glib主事件循环。Qt在Linux上使用相同的事件循环,因此您不需要在代码中调用exec()。通过创建QEventLoop实例、向事件循环发送退出调用并对其进行exec()处理,只设置一次事件循环。然后将控制返回到主程序。您的代码仍将在事件到达时运行(计时器超时、网络数据包到达等)。
与Qt的本地事件循环集成的美妙之处在于,如果其他人已经在旋转该循环,则不需要执行主exec()。
因此,下面是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的任何函数,调用应用程序的事件循环将正确处理这些事件。
与线程相比,我更喜欢这样的解决方案,因为一般来说,它听起来更稳定。
如果线程对你来说是不稳定的,你做的不对。网络支持将在一个专门的线程上运行。这可能是第二个线程的少数合法用途之一,因为这样,您的网络数据处理就不会因为userland呈现器和排定器将屏幕上看到的内容组合在一起而延迟。
发布于 2016-03-02 10:54:55
如果您需要运行两个独立的事件循环,我建议使用QThread。
https://stackoverflow.com/questions/35744834
复制相似问题