首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单独的线程上调用boost signals2插槽

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

Stack Overflow用户
提问于 2020-11-10 12:26:13
回答 1查看 178关注 0票数 1

如何在不阻塞发出信号的线程的情况下调用单独线程上的boost signals2插槽?我希望通过QueuedConnection参数获得Qt5 QObject::connect的功能;有关Qt5的详细信息,请参阅Threads and QObjects。也就是说,我需要能够发出一个boost事件信号,而不会阻塞发出该信号的线程;连接的插槽是从一个单独的“signals2”线程调用的。

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

我相信组合boost signals2和asio作为事件循环可以做我需要的事情,但我不确定如何实现它。另外,我相信其他人也有类似的需求,所以我正在寻找如何实现这一点的想法和建议。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-28 06:31:38

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

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

假设你不关心槽是在哪个线程上调用的,只要它不阻塞,你可以把你的信号包装在一个小对象中,这个对象会发送到不同的线程。

一个简单的例子,使用boost::asio

代码语言:javascript
复制
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的。

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

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

https://stackoverflow.com/questions/64762884

复制
相关文章

相似问题

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