如何在不阻塞发出信号的线程的情况下调用单独线程上的boost signals2插槽?我希望通过QueuedConnection参数获得Qt5 QObject::connect的功能;有关Qt5的详细信息,请参阅Threads and QObjects。也就是说,我需要能够发出一个boost事件信号,而不会阻塞发出该信号的线程;连接的插槽是从一个单独的“signals2”线程调用的。
我喜欢MOC的功能,但我不能在我的Qt5和实现中使用QObject作为基类和额外的MOC机制。Boost signals2在其连接处理中是线程安全的,但它在对已连接插槽的调用中不是多线程的(实际上我只是在寻找非阻塞)。
我相信组合boost signals2和asio作为事件循环可以做我需要的事情,但我不确定如何实现它。另外,我相信其他人也有类似的需求,所以我正在寻找如何实现这一点的想法和建议。
谢谢!
发布于 2020-12-28 06:31:38
boost::signals2::signal在发出信号的线程上顺序调用插槽。如果您希望实现非阻塞行为,则只需在不同的线程上发出信号即可。
据我所知,Qt QueuedConnection不仅意味着插槽是异步调用的,而且是在接收器特定的线程事件循环上调用的。这与在任意线程上调用插槽不同。你的意图我不是100%清楚。
假设你不关心槽是在哪个线程上调用的,只要它不阻塞,你可以把你的信号包装在一个小对象中,这个对象会发送到不同的线程。
一个简单的例子,使用boost::asio
struct async_signal : std::enable_shared_from_this<async_signal>
{
boost::signals2::signal<void(void)> signal;
boost::asio::io_context executor;
void emit_async()
{
boost::asio::post(excutor, [self_weak = weak_from_this()]()
{
if (auto self = self_weak.lock())
{
signal();
}
});
}
}现在,插槽将在调用io_context::run()的任何线程上被顺序调用。这通常是某种线程池,比如boost::asio::thread_pool;
如果你想知道std::enable_shared_from_this部分,这是针对thread safety的。
当然,你也可以将这个类模板化并很好地封装,但我认为这样更容易理解。
https://stackoverflow.com/questions/64762884
复制相似问题