是否有任何方法将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框架的主循环中。
欢迎任何建议和解决方案(更好)。
发布于 2014-12-14 22:26:59
这是一个很老的问题,但是对于现在正在阅读它的人来说,我想分享我的代码,它是QAbstractEventDispatcher的一个实现,用于boost::asio。
您只需要在创建QApplication之前添加以下行(通常在main()中)。
QApplication::setEventDispatcher(new QAsioEventDispatcher(my_io_service));
这将导致io_service在一个线程中与qt应用程序一起运行,而不会增加延迟和性能下降(就像在解决方案中“不时调用io_service::poll()”一样)。
不幸的是,我的解决方案仅适用于posix系统,因为它使用asio::posix::stream_descriptor。Windows支持可能需要完全不同的方法或非常相似的方法--我真的不知道。
发布于 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信号来进行更多的控制。
发布于 2009-06-19 11:00:13
如果我正确理解你的问题,你有为Boost.Asio编写的代码。您希望在GUI应用程序中使用该代码。
问题中不清楚的是,您是否希望通过asynio封装Qt/Gtk网络层以使代码工作,如果您只是在寻找将gui事件循环和asynio放在一起的解决方案。
我会假设第二个案子。
Qt和Gtk都有在事件循环中集成外部事件的方法。例如,请参见将Qt事件循环插入到Gtk中的qtgtk。
在Qt的特定情况下,如果您想为Qt生成事件,可以使用以下类:QAbstractEventDispatcher。
在快速查看了boost asio之后,我认为您需要执行以下操作:
https://stackoverflow.com/questions/1001032
复制相似问题