【问题标题】:libuv event loop in qtqt中的libuv事件循环
【发布时间】:2014-10-31 09:03:19
【问题描述】:

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

我找到了这个https://stackoverflow.com/a/17329626/4014896

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

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

【问题讨论】:

    标签: qt embed libuv


    【解决方案1】:

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

    您粘贴的第一个链接显示了如何处理自上次调用以来发生的 libuv 事件。 while 声明如果没有调度事件(因为它只会继续轮询),则将使用约 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 - 尽管它需要大量也可以工作。

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

    问候,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多