qt中的libuv事件循环

时间:2014-09-06 16:27:00

标签: qt embed libuv

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

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

但我不知道它是如何运作的。它不应该导致示例中的100%CPU使用率吗? 我怎样才能将它嵌入到QT中?

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

1 个答案:

答案 0 :(得分: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 - 尽管它需要大量的也工作。

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

此致