zoukankan      html  css  js  c++  java
  • Boost信号/槽signals2

      信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便。项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定。

      signals2基于Boost里另一个库signals实现了线程安全的观察者模式。signal中一个比较重要的操作函数是connect,它把插槽连接到信号上;插槽可以是任意可调用对象,包括函数指针、函数对象,以及他们的bind/lambda表达式和function对象。connect函数将返回一个connection对象,表示了信号和插槽之间的连接关系,connection对象可以更灵活的处理信号与槽函数的连接、断开等关系。

      以下是一个使用Boost信号/槽的小例子:  

    #include "stdafx.h"
    #include <iostream>
    #include <boost/signals2.hpp>
    #include <boost/bind.hpp>
    
    using namespace std;
    using namespace boost::signals2;
    
    void slots1()
    {
        cout<<"slots1 called"<<endl;
    }
    
    void slots2()
    {
        cout<<"slots2 called"<<endl;
    }
    
    class A
    {
    public:
        static int staticMemberFunc(int param)
        {
            cout<<"A::staticMemberFunc called, param: "<<param<<endl;
            return 0;
        }
        int memberFunc(int param)
        {
            cout<<"A::memberFunc called, param: "<<param<<endl;
            return 0;
        }
    };
    
    int main()
    {
        boost::signals2::signal<void()> sig;
        boost::signals2::signal<int(int)> sig2;
    
        A a;
        connection c1 = sig.connect(&slots1);
        connection c2 =sig.connect(&slots2);
        cout<<"First call-------------------"<<endl;
        sig();
        if (c2.connected())
        {
            c2.disconnect();
        }
        cout<<"Second call-------------------"<<endl;
        sig();
    
        connection c3 =sig2.connect(&A::staticMemberFunc);// 绑定成员函数
        connection c4 =sig2.connect(boost::bind(&A::memberFunc, &a, _1));// 绑定静态成员函数
    
        cout<<"Return code is: "<<*sig2(44)<<endl;// 只能返回最后被调用的插槽的返回值
        return 0;
    }

    //Output:
     

    First call-------------------
    slots1 called
    slots2 called
    Second call-------------------
    slots1 called
    A::staticMemberFunc called, param: 44
    A::memberFunc called, param: 44
    Return code is: 0

      注意使用解引用操作符*获取的只是最后被调用的插槽的返回值,如果需要知道每个插槽函数的返回值需要使用合并器(combiner)。

      Boost的信号/槽在信号被触发时,槽函数只能是同步执行,没有像Qt那样的异步接口。Qt异步的实现实际上是将信号push到一个队列中,然后由统一的线程来处理信号对应的槽函数而已。当然也可以根据这个原理自己封装带异步的信号/槽机制,不过那样的话应该需要另外开启线程了。

  • 相关阅读:
    颜色代码 #000~#FFF & DML案例设计
    SQLScript DML 创建 & 查询 & 序列(条件查询 日起查询 关联查询 子查询 分组查询 查询内容拼接 模糊查询)
    Java JDBC 连接数据库 Demo
    document的JavaScript一些用法
    dxSpreadSheet的报表demo-关于设计报表模板问题
    dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
    TJSON的烦人的泄漏
    dxSpreadSheet的报表
    TDXSpreadSheet中自定义公式函数三大步骤
    SVN项目监视器的配置文件
  • 原文地址:https://www.cnblogs.com/jiayayao/p/6246161.html
Copyright © 2011-2022 走看看