如何将提高。Asio主循环在GUI框架喜欢Qt4或GTK
-
05-07-2019 - |
题
是否有任何方法将提高。Asio与Qt4(最佳)的或GTK主循环?GTK提供了投票(2)API所以在技术上是应该是可能的。脱提供了自己的网络层,但是我更喜欢使用现有的代码写的提升。Asio.我要把他们 没有 使用额外的螺纹。
是否有任何引用如何做到这Qt4(最佳)的或GTKmm?
谢谢。
编辑
我想clearify几件事情需要做出的答复更加容易。两夸脱和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
因此,问题是,如何将现有的"器级轮询器"作为反应器
提升。Asio io_service
.今天,提升。Asio可以利用的选择,kqueue,epoll/dev/调查和序数据检索机制作为反应堆/摄器的服务。我要把它的主要环GUI框架。
任何建议和解决方案(更佳)的欢迎。
解决方案
它是相当的旧问题,但对于那些正在读它,现在我想分享的 我的代码 这是一个执行QAbstractEventDispatcher为提升::asio.
所有你需要的是添加以下行之前创造QApplication(通常是在主要()).
QApplication::setEventDispatcher(new QAsioEventDispatcher(my_io_service));
它将导致,io_service正在运行一起建的应用中一个线程,无需额外的延迟和性能下降(像在解决与调io_service::调查()"有时").
不幸的是,我的解决方案是为posix系统,因其使用asio::posix::stream_descriptor.Windows支持可能需要完全不同的方法或相当类似的-我真的不知道。
其他提示
简单:
建立一个脱槽,电话的 io_service::poll_one()
属于gui。连接,隙夸脱的 tick
信号。
在深度:
幸运的是,你提升。Asio是非常精心设计的。有许多选项,就如何提供一个线程的执行的基本步内部。人们已经提到使用 io_service::run()
, ,阻断呼吁有许多缺点。
你只允许访问gui部件从一个单一的线。外线程一般需要以后的事件以gui如果他们想要做的改变任何部件。这是非常类似于如何Asio工作。
天真的做法是只是把一个线程(或时间),以运行 io_service::run()
和有Asio完成处理程序,后一个gui信号。此 将 的工作。
反而你可以使用的保证,完成处理程序只会是所谓的在线程的执行 io_service
呼叫者。没有gui线呼叫 io_service::run()
因为它是阻断和可以挂gui。而不是使用 io_service::poll()
或 io_service::poll_one()
.这将导致的任何待决Asio完成处理程序被称为从gui线。由于处理程序运行在gui线,他们是免费修改的部件。
现在你需要确保 io_service
都有机会定期运行。我建议具有重复gui信号呼叫 poll_one()
几倍。我相信,建设有打勾的信号,就可以做到。当然,你可以滚你自己的夸脱的信号进行更多的控制。
如果我理解你的问题是否正确,你们代码写的提升。Asio.你想要使用这些代码内GUI应用程序。
什么是不清楚,在你的问题是如果你想换脱/Gtk网络层通过asynio代码的工作,如果你只是寻找一个解决方案具有两个gui事件循环和asynio在一起。
我会假设的第二种情况。
两夸脱和Gtk有方法将外交事件在他们的事件的循环。例如见 qtgtk 那里的脱事件循环插入Gtk。
在特定情况下脱,如果你想要的事件产生于夸脱,可以使用以下类别: QAbstractEventDispatcher.
后一个快速提升asio,我认为你需要做到以下几点:
- 有一个经常性QTimer与持续时间为零,呼吁io_service::运行()所有的时间。这种方式,提高::asio会叫你的完成处理程序,尽快为您步操作完成。
- 在你完成处理程序,两个选项:
- 如果你完成作是一个漫长的,分离GUI,做你的业务,并确保对话qApp.processEvents()经常保持GUI响应
- 如果你只是想要回通信的gui:
- 定义一个自定义 QEvent 类型
- 订阅这个事件
- 后您的活动,以夸脱事件循环使用 QCoreApplication::postEvent().
真正融合的主要循环 是 可能的。这只是一个很大的痛苦(和我还没有真的尝试).
运行io_service::运行()对一个独立的线是可能的路要走。