调用单独线程上的boost signals2插槽



如何在不阻塞发出信号的线程的情况下,在单独的线程上调用boost signals2插槽?我想通过QueuedConnection参数获得Qt5QObject::connect的功能;有关Qt5的详细信息,请参阅线程和QObjects。也就是说,我需要能够发射升压信号2信号,而不可能阻塞正在发射信号的线程;连接的槽从一个单独的"槽"调用;事件";线

我喜欢Qt5 API的功能,但我不能在API和实现中使用QObject作为基类和附加的MOC机制。Boost signals2在其连接处理中是线程安全的,但它在对连接插槽的调用中不是多线程的(实际上我只是在寻找非阻塞(。

我相信boost信号2和asio作为一个事件循环的组合可以满足我的需求,但我不确定如何实现这一点。此外,我相信其他人也有类似的需求,所以我正在寻找如何实现这一目标的想法和建议。

谢谢!

boost::signals2::signal在发出信号的线程上顺序调用槽。如果您希望实现非阻塞行为,您只需要自己在不同的线程上发出信号。

据我所知,QtQueuedConnection不仅意味着插槽是异步调用的,而且是在接收器特定的线程事件循环上调用的。这与在任意线程上调用插槽不同。我还不能百分之百清楚你的意图。

假设您不关心调用插槽的线程,只要它不阻塞,您就可以将信号封装在一个小对象中,该对象发布到另一个线程。

一个简单的例子,使用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部分,这是为了线程安全。

当然,您可以将这个类模板化并封装好,但我认为这样更容易理解。

最新更新