是否有任何方法将提高。Asio与Qt4(最佳)的或GTK主循环?GTK提供了投票(2)API所以在技术上是应该是可能的。脱提供了自己的网络层,但是我更喜欢使用现有的代码写的提升。Asio.我要把他们 没有 使用额外的螺纹。

是否有任何引用如何做到这Qt4(最佳)的或GTKmm?

谢谢。

编辑

我想clearify几件事情需要做出的答复更加容易。两夸脱和GTKmm提供 "选择象"功能:

因此,问题是,如何将现有的"器级轮询器"作为反应器 提升。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:
      1. 定义一个自定义 QEvent 类型
      2. 订阅这个事件
      3. 后您的活动,以夸脱事件循环使用 QCoreApplication::postEvent().

真正融合的主要循环 可能的。这只是一个很大的痛苦(和我还没有真的尝试).

运行io_service::运行()对一个独立的线是可能的路要走。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top