首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以及为什么要使用Boost signals2?

如何以及为什么要使用Boost signals2?
EN

Stack Overflow用户
提问于 2013-09-06 17:38:40
回答 1查看 22.9K关注 0票数 28

学习c++并尝试熟悉一些模式。显然,signals2文档有大量的事情可以通过插槽和信号来完成。我不明白的是,我应该将它用于何种类型的应用程序(用例)。

我考虑的是状态机调度变更事件。来自动态类型的背景(C#、Java等),您将使用事件分派程序或静态引用或回调。

在c++中使用跨类回调有困难吗?这就是signals2存在的本质原因吗?

示例中的一个例子是文档/视图。这种模式比使用函数向量并在循环中调用每个函数,或者说在已注册侦听类实例中调用状态更改的lambda更适合?

代码语言:javascript
复制
class Document
{
public:
    typedef boost::signals2::signal<void ()>  signal_t;

public:
    Document()
    {}

    /* Connect a slot to the signal which will be emitted whenever
      text is appended to the document. */
    boost::signals2::connection connect(const signal_t::slot_type &subscriber)
    {
        return m_sig.connect(subscriber);
    }

    void append(const char* s)
    {
        m_text += s;
        m_sig();
    }

    const std::string& getText() const
    {
        return m_text;
    }

private:
    signal_t    m_sig;
    std::string m_text;
};

代码语言:javascript
复制
class TextView
{
public:
    TextView(Document& doc): m_document(doc)
    {
        m_connection = m_document.connect(boost::bind(&TextView::refresh, this));
    }

    ~TextView()
    {
        m_connection.disconnect();
    }

    void refresh() const
    {
        std::cout << "TextView: " << m_document.getText() << std::endl;
    }
private:
    Document&               m_document;
    boost::signals2::connection  m_connection;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-08 07:07:14

Boost.Signals2不仅仅是一个“回调数组”,它还有很多附加价值。海事组织最重要的一点是:

  1. 线程安全:几个线程可以同时连接/断开/调用相同的信号,而不引入竞争条件。这在与异步子系统(如运行在自己线程中的活动对象)通信时尤其有用。
  2. connectionscoped_connection句柄允许断开连接而不直接访问signal。请注意,这是断开无法比较的插槽(如boost::function (或std::function) )的唯一方法。
  3. 临时插槽堵塞。提供一种干净的方法来暂时禁用侦听模块(例如。当用户请求暂停接收视图中的消息时)。
  4. 自动时隙寿命跟踪:信号与“过期”插槽自动断开连接。考虑一下当插槽是引用由shared_ptrs管理的不可复制对象的绑定器时的情况: aSignal_.connect(your_signal_type::slot_type(slot).track(l));//我们不希望aSignal_影响listener的寿命,但当listener被破坏时,它会自动断开连接。

当然,一个人可以自己“使用函数向量并在循环中调用每个函数”来重新实现上述所有功能,但问题是它如何比Boost.Signals2更好。重新发明轮子很少是个好主意。

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

https://stackoverflow.com/questions/18663490

复制
相关文章

相似问题

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