似乎唯一为 Signal 类和槽中调用的内容提供安全跨线程信号的实现是 QT。 (也许我错了?)。
但我不能在我正在做的项目中使用QT。那么我如何从不同的线程提供安全的 Slots 调用(例如使用 Boost::signals2)?插槽内的互斥体是唯一的方法吗?我认为 Signals2 会保护自己,但不会保护插槽内所做的事情。
Thanks
您可以结合 boost::bind 和 boost ASIO 来创建跨线程调用。
# In Thread 2
boost::asio::io_service service;
boost::asio::io_service::work work (service); // so io service won't stop if there is no work
service.run() # starting work thread
# In Thread 1
service.post (boost::bind (&YourClass::function, &yourClassInstance, parameter1, parameter2))
线程 2 将进入循环并执行您的绑定函数。我认为您也可以将 Boost::Signals2 调用放入此循环中。
但请注意:如果进行跨线程信号发送,请确保目标对象在调用时仍然存在。您可以通过删除目标析构函数中的所有连接(而不是其基类析构函数中的所有连接,另请参阅信号可追踪类 http://www.boost.org/doc/libs/1_39_0/doc/html/boost/signals2/trackable.html)
我不太喜欢 Boost::Signals2 ,因为它的堆栈跟踪和编译时间很长(博客文章 http://www.cgvis.de/content/?p=71).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)