sig/slot机制是对象之间发送和接收消息的机制。sigslot是一个用C++实现的sig/slot机制的线程安全、类型安全的开源代码库。只有一个头文件sigslot.h,其基本功能包括connect、disconnect和emit。优点:不用担心空回调,回调对象析构时会自动断开连接;它支持多线程,线程安全,并且有锁。缺点:只能回调void类型的函数,不支持返回值。boost中的signals库结构类似,支持返回值,但是引入了boost中的其他库;槽没有优先级,回调队列中的顺序不能动态调整。槽函数是一个普通的成员函数,但是有如下限制:返回值必须为void;槽参数个数范围为0~8;实现插槽的类必须继承自has_slots<>。1和2是sigslot库作者的限制。笔者权衡了各种因素后做出了决定。如果需要,可以修改sigslot代码取消限制。3是sigslot的机制基础,必须遵循,除非重写。sig/slot可以带参数也可以不带参数,最多可以带8个参数。signal0<>xxx叫做sig,用来发送信号,继承has_slots<>的类的成员函数叫做slot,是信号处理函数。sigslot的核心就在这里,就是通过建立对应关系来实现对象之间的消息交互。sig是一个成员变量,它的形状像signal+n,后面的n表示signal可以接收多个参数,任意类型,最多8个。建立sig和slot的对应关系通过调用sig的connect函数。connect函数接收两个参数,一个是消息目的对象的地址,一个是目的对象的成员函数指针。为了使整个机制有效工作,目标类必须继承自has_slots<>,并且sig/slot参数类型必须一致。也可以将一个sig连接到多个slot,这样每一个sig发出一个信号,每个连接的slot都能收到信号。通过调用sig的disconnect函数来断开sig与slot的连接,参数只有一个,即目标对象的地址。一般不需要显式调用disconnect函数。在sig类和目标类(包含slot函数的类)的析构函数中,会自动调用disconnect来断开sig和slot的连接。您还可以使用disconnect_all断开sig的所有插槽。测试代码:#include#include#include#include#include"sigslot.h"usingnamespacestd;classCSender{public:sigslot::signal2m_pfnsigDanger;voidPanic(){staticintnVal=0;字符szVal[20]={0};sprintf(szVal,"help--%d",nVal);m_pfnsigDanger(szVal,nVal++);}};类CReceiver:公共sigslot::has_slots<>{public:无效OnDanger(字符串strMsg,intnVal){cout<”<0){cout<<"inwhile..."<