首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在图形用户界面框架(如Boost.Asio或GTK )中集成Qt4主循环

如何在图形用户界面框架(如Boost.Asio或GTK )中集成Qt4主循环
EN

Stack Overflow用户
提问于 2009-06-16 11:57:47
回答 5查看 13.1K关注 0票数 29

是否有任何方法将Boost.Asio与Qt4 (首选)或GTK主循环集成?GTK提供了类似于API的轮询(2),因此在技术上应该是可能的。Qt提供了自己的网络层,但是我更喜欢使用为Boost.Asio编写的现有代码。我想使用一个额外的线程来集成它们,不使用而不使用

对于Qt4 (首选)或GTKmm,有参考吗?

谢谢。

编辑

我想澄清几件事,使答案更容易。Qt和GTKmm都提供了"select“功能:

因此,问题在于,如何将现有的“选择器/计票器”集成到Boost.Asio io_service反应器中。如今,Boost.Asio可以使用select、kqueue、epoll、/dev/poll和iocp作为反应堆/前置器服务。我想把它集成到GUI框架的主循环中。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-12-14 22:26:59

这是一个很老的问题,但是对于现在正在阅读它的人来说,我想分享我的代码,它是QAbstractEventDispatcher的一个实现,用于boost::asio。

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

代码语言:javascript
运行
复制
QApplication::setEventDispatcher(new QAsioEventDispatcher(my_io_service));

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

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

票数 10
EN

Stack Overflow用户

发布于 2009-12-21 18:58:19

Simple:构建一个QT槽,该槽调用属于gui的io_service::poll_one()。把那个插槽连接到QT的tick信号。

深度为您幸运地设计了Boost.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()。这将导致从gui线程调用任何挂起的Asio完成处理程序。因为处理程序在gui线程中运行,所以它们可以自由地修改小部件。

现在,您需要确保io_service有机会定期运行。我建议使用重复的gui信号呼叫poll_one()几次。我相信QT有一个滴答信号,这会起作用的。当然,您可以使用自己的QT信号来进行更多的控制。

票数 17
EN

Stack Overflow用户

发布于 2009-06-19 11:00:13

如果我正确理解你的问题,你有为Boost.Asio编写的代码。您希望在GUI应用程序中使用该代码。

问题中不清楚的是,您是否希望通过asynio封装Qt/Gtk网络层以使代码工作,如果您只是在寻找将gui事件循环和asynio放在一起的解决方案。

我会假设第二个案子。

Qt和Gtk都有在事件循环中集成外部事件的方法。例如,请参见将Qt事件循环插入到Gtk中的qtgtk

在Qt的特定情况下,如果您想为Qt生成事件,可以使用以下类:QAbstractEventDispatcher

在快速查看了boost asio之后,我认为您需要执行以下操作:

  • 有一个持续时间为零的循环QTimer,它一直调用io_service::run()。这样,boost::asio将在异步操作完成后立即调用完成处理程序。
  • 在完成处理程序中,有两个选项:
    • 如果您的完成操作是长的,与GUI分离,那么做您的业务,并确保定期调用qApp.processEvents()以保持GUI响应。
    • 如果您只想与gui:通信
      1. 定义自定义QEvent类型
      2. 订阅此事件
      3. 使用QCoreApplication::postEvent()将事件发布到Qt事件循环。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1001032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档