Skip to main content
 首页 » 编程设计

qt4之如何在 Qt4 或 GTK 等 GUI 框架中集成 Boost.Asio 主循环

2024年10月25日25pander-it

有什么方法可以将 Boost.Asio 与 Qt4(首选)或 GTK 主循环集成?
GTK 提供 poll(2) 之类的 API,所以技术上应该是可能的。 Qt 提供了自己的网络层,但我更喜欢使用为 Boost.Asio 编写的现有代码。
我想整合它们没有 使用额外的线程。

对于 Qt4(首选)或 GTKmm,是否有任何引用方法可以执行此操作?

谢谢。

编辑

我想澄清几件事以使答案更容易。 Qt 和 GTKmm 都提供
“选择喜欢”功能:

  • http://qt-project.org/doc/qt-5.0/qtcore/qsocketnotifier.html
  • http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__MainLoop.html

  • 所以,问题是,如何将现有的“选择器/轮询器”作为 react 器集成到
    Boost.Asio io_service .今天,Boost.Asio 可以使用 select、kqueue、epoll、/dev/poll 和 iocp 作为 reactor/proactor 服务。我想将它集成到 GUI 框架的主循环中。

    欢迎任何建议和解决方案(更好)。

    请您参考如下方法:

    这是一个相当古老的问题,但对于那些现在正在阅读它的人,我想分享 my code这是用于 boost::asio 的 QAbstractEventDispatcher 的实现。

    您只需要在创建 QApplication 之前添加以下行(通常在 main() 中)。

    QApplication::setEventDispatcher(new QAsioEventDispatcher(my_io_service)); 
    

    这将导致 io_service 与 qt 应用程序在一个线程中一起运行,而不会产生额外的延迟和性能下降(就像在“不时”调用 io_service::poll() 的解决方案中一样)。

    不幸的是,我的解决方案仅适用于 posix 系统,因为它使用 asio::posix::stream_descriptor 。 Windows 支持可能需要完全不同的方法或非常相似 - 我真的不知道。