运行 并行的多个 QEventLoop(对于 QtNetwork)

Run multiple QEventLoops in parallel (for QtNetwork)

我尝试使用 Qt 网络支持扩展 Ubuntu/Linux 桌面下 运行 的旧程序。与这些库进行 LAN 通信需要 运行 QEventLoop 的 .exec() 才能真正开始工作(即:接受连接、接收、发送等)

问题

好吧,问题是我不知道这个事件循环在主程序中的什么位置,而且因为我对它的设计含糊不清,所以我更喜欢尽可能独立的解决方案。

我的想法

我已经检查过我不需要 main-QEventLoop,可以再做一个只是为了网络(即嵌套)。不幸的是,我无法弄清楚如何 运行 两个并行循环,因为我的程序在 nested-.exec() 处停止,所以主程序也停止了。

所以我的主要目的实际上是用 Qt 网络扩展主程序,我也对其他解决方案持开放态度。

如果您需要 运行 2 个独立的事件循环,我建议使用 QThread。

主程序是交互式的吗?如果是,那么它很可能 运行 是 glib 主事件循环。 Qt 在 Linux 上使用相同的事件循环,因此您无需在代码中调用 exec()。通过创建 QEventLoop 的实例,向其发出 quit 调用,然后 exec() 调用它,仅启动一次事件循环。然后return控制到主程序。当事件到达(计时器超时、网络数据包到达等)时,您的代码仍将 运行。

通过 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 的任何函数,事件将由调用应用程序的事件循环正确处理。

I'd prefer such a solution compared to threading, since it sounds more stable in general.

如果线程对您来说不稳定,那是您做的不对。网络支持将 运行 在专用线程上表现出色。这可能是第二个线程的为数不多的合法用途之一,因为这样一来,您的网络数据处理就不会被用户空间渲染器和合成器将您在屏幕上看到的内容放在一起的甜蜜时间所延迟。