sig/slot
机制就是对象之间发送和接收消息的机制。sigslot
是一个线程安全、类型安全,用C++
实现的sig/slot
机制的开源代码库,只有sigslot.h
一个头文件,基本功能有connect
、disconnect
及emit
。
优点:
- 不用担心空回调,当回调对象析构时会自动
disconnect
; - 支持多线程,线程安全,有锁。
缺点:
- 只能回调
void
类型函数,不支持返回值,boost
中的signals
库架构类似,支持返回值,但引入了boost
中的其它库; -
slot
没有优先级,不能动态调整回调队列中的先后顺序。slot
函数就是普通的成员函数,但有以下限制: - 返回值必须为
void
; -
slot
参数个数范围为0-8
个; - 实现
slot
的类必须继承自has_slots<>
。
1
和2
是sigslot
库作者的限制,作者权衡各方面因素后做出的决定,如果觉得有必要可以修改sigslot
代码取消该限制,而3
是sigslot
的机制基础,必须遵守,除非重写。
sig/slot
可以带参数也可以不带,最多可以带8
个参数。signal0<> xxx
称之为sig
,即用来发出信号,而继承has_slots<>
的类的成员函数则称之为slot
,即信号处理函数。sigslot
的核心就在这里,就是通过建立对应关系来实现对象间的消息交互。sig
是一个成员变量,它形如signal + n<type1, type2...>
,后面的n
表示signal
可以接收几个参数,类型任意,最多为8
个。
通过调用sig
的connect
函数建立sig
和slot
间的对应关系。connect
函数接收两个参数,一个是消息目的对象的地址, 另一个是目的对象的成员函数指针。为了让整个机制有效运行,目的类必须从has_slots<>
继承,并且sig/slot
参数类型必须一致。也可以将一个sig
连接到多个slot
上,这样每次sig
发出信号的时候,每个连接的slot
都能收到该信号。
通过调用sig
的disconnect
函数断开sig
和slot
之间的连接,只有一个参数,即目的对象的地址。一般不需要显式调用disconnect
函数,在sig
类和目的类(包含slot
函数的类)析构函数中将自动调用disconnect
断开sig
和slot
的连接。也可使用disconnect_all
断开该sig
的所有slot
。
测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38#include <unistd.h> #include <stdio.h> #include <iostream> #include <string> #include "sigslot.h" using namespace std; class CSender { public: sigslot::signal2<string, int> 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
最后
以上就是无语金针菇最近收集整理的关于 sigslot信号槽机制参考文章的全部内容,更多相关内容请搜索靠谱客的其他文章。
发表评论 取消回复