4

有没有不使用多线程的方法?

我发现了这个https://stackoverflow.com/a/17329626/4014896

但我不明白它是如何工作的。它不应该在示例中导致 100% 的 CPU 使用率吗?以及如何将它嵌入到 QT 中?

还有这个:https ://github.com/svalaskevicius/qt-event-dispatcher-libuv 但是根本没有文档。但从我看来,它似乎是从示例 QSocket 转换为 uv_tcp_socket 的东西,这不是我正在寻找的东西。

4

1 回答 1

6

简而言之 - 您要么需要合并两个事件循环,要么使用单独的线程并手动同步事件处理程序。

您粘贴的第一个链接显示了如何处理自上次调用以来发生的 libuv 事件。如果没有调度事件(因为它只会继续轮询),则声明将使用〜100%的CPU。

第二个链接(qt-event-dispatcher-libuv)是我为解决相同问题而创建的一个项目。但是,它确实如您所描述的那样工作 - 通过使用 libuv 来处理 Qt 的事件循环(并通过这样做 - 将两个事件循环合并为一个)。

要使用它,您只需要使用http://qt-project.org/doc/qt-5/qcoreapplication.html#setEventDispatcher在您的应用程序中注册事件调度程序。使用此库的示例 - https://github.com/svalaskevicius/qtjs-generator/blob/master/src/runner/main.cpp#L179

使用这种方法仍有一个问题——虽然它在 linux 上运行良好,但在 OS X 上存在一些问题,因为 Qt 的 Cocoa 平台支持插件处理了一些 Cocoa 的事​​件循环操作,并且也没有提供很好的 API 来合并它(目前它更新它们一个它在一个小的超时后释放,所以有一些(几乎没有?)明显的延迟来处理 GUI 事件) - 我计划移植平台支持插件以便能够集成它,但那仍然在未来。而且我还没有在 Windows 上测试过它:)

另一种解决方案可能是尝试从我已经完成的另一个方向合并两个循环 - 而不是让 Qt 使用 libuv,可以提供使用 Qt 处理程序的 libuv api - 尽管它也需要大量工作.

如果我可以提供更多信息,请告诉我。

问候,

于 2014-09-13T16:36:00.797 回答