sigslot信号槽机制

sig/slot机制就是对象之间发送和接收消息的机制。sigslot是一个线程安全、类型安全,用C++实现的sig/slot机制的开源代码库,只有sigslot.h一个头文件,基本功能有connectdisconnectemit

优点:

  1. 不用担心空回调,当回调对象析构时会自动disconnect
  2. 支持多线程,线程安全,有锁。

    缺点:

  3. 只能回调void类型函数,不支持返回值,boost中的signals库架构类似,支持返回值,但引入了boost中的其它库;
  4. slot没有优先级,不能动态调整回调队列中的先后顺序。

    slot函数就是普通的成员函数,但有以下限制:

  5. 返回值必须为void
  6. slot参数个数范围为0-8个;
  7. 实现slot的类必须继承自has_slots<>

12sigslot库作者的限制,作者权衡各方面因素后做出的决定,如果觉得有必要可以修改sigslot代码取消该限制,而3sigslot的机制基础,必须遵守,除非重写。

sig/slot可以带参数也可以不带,最多可以带8个参数。signal0<> xxx称之为sig,即用来发出信号,而继承has_slots<>的类的成员函数则称之为slot,即信号处理函数。sigslot的核心就在这里,就是通过建立对应关系来实现对象间的消息交互。sig是一个成员变量,它形如signal + n,后面的n表示signal可以接收几个参数,类型任意,最多为8个。

通过调用sigconnect函数建立sigslot间的对应关系。connect函数接收两个参数,一个是消息目的对象的地址, 另一个是目的对象的成员函数指针。为了让整个机制有效运行,目的类必须从has_slots<>继承,并且sig/slot参数类型必须一致。也可以将一个sig连接到多个slot上,这样每次sig发出信号的时候,每个连接的slot都能收到该信号。

通过调用sigdisconnect函数断开sigslot之间的连接,只有一个参数,即目的对象的地址。一般不需要显式调用disconnect函数,在sig类和目的类(包含slot函数的类)析构函数中将自动调用disconnect断开sigslot的连接。也可使用disconnect_all断开该sig的所有slot

测试代码:

#include 
#include 
#include 
#include 

#include "sigslot.h"


using namespace std;

class CSender {
public:
    sigslot::signal2 m_pfnsigDanger;

    void Panic() {
        static int nVal = 0;
        char szVal[20] = {0};

        sprintf(szVal, "help--%d", nVal);

        m_pfnsigDanger(szVal, nVal++);
    }
};

class CReceiver: public sigslot::has_slots<> {
public:
    void OnDanger(string strMsg, int nVal) {
        cout << strMsg.c_str() << " ==> " << nVal << endl;
    }
};

int main(int argc, char** argv)
{
    int count = 5;
    CSender sender;
    CReceiver recever;

    sender.m_pfnsigDanger.connect(&recever, &CReceiver::OnDanger);

    cout << "connect succ!" << endl;

    while(count-- > 0) {
        cout << "in while..." << endl;

        sender.Panic();
        sleep(2);

        cout << "end of sleep" << endl;
    }

    sender.m_pfnsigDanger.disconnect(&recever);

    return 0;
}

sigslot主页: http://sigslot.sourceforge.net
sigslot文档: http://sigslot.sourceforge.net/sigslot.pdf

参考文章

Sigslot介绍
sigslot示例
Signals、sigslot简介
信号槽库:sigslot.h和sigc++使用
sigslot库源码分析
深入剖析WebRTC事件机制之Sigslot

你可能感兴趣的:(linux)