C++ sigslot的使用

C++ sigslot的使用

这篇学习笔记应该是去年写的,现在把他放在博客上。
github上也有相应的c库,或者其他相对应的库

背景

1.工作中使用这种消息通知机制signals/slots

2.参考libjingle库,原始sigslot库(sigslot.sourceforge.net)

3.直接在以下环境中使用原始sigslot.h头文件会出现问题

实例

环境:编译器Dev-C++,window7-64

sample代码

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
39
40
41
42
#include <iostream>
#include "sigslot.h"
#include <windows.h>//为了在widnow中使用Sleep函数
using namespace sigslot;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
class Sender{
public :
sigslot::signal2<std::string,int> signalSender;
void help1(){
signalSender("Help!",1);
}
void help2(){
signalSender("Help,hahha,just test",2);
}
};
class Receiver:public sigslot::has_slots<>{
public:
void onReceiver(std::string message,int type){
if(type==1){
std::cout<<"correct slot"<<std::endl;
}else{
std::cout<<"wrong slot"<<std::endl;
}
}
};
int main(int argc, char** argv) {
Sender sender;
Receiver rec;
sender.signalSender.connect(&rec,Receiver::onReceiver);
Sleep(3000);
sender.help1();
Sleep(3000);
sender.help2();
Sleep(3000);
sender.signalSender.disconnect(&rec);
return 0;
}

siglots.h修改

为了能够运行,还要对siglots.h进行修改

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
//typedef sender_set::const_iterator都要加上typename
typedef typename sender_set::const_iterator
//connections_list::const_iterator前面都要加上typename
typename connections_list::const_iterator
//connections_list::iterator都要加上typename
typename connections_list::iterator
//以下+n都要改为数字0-8
//在_connection+n(构造函数)中的变量名错误
pobject = NULL;
pmemfun = NULL;
//改为:
m_pobject = NULL;
m_pmemfun = NULL;
//class signal+n的成员变量中缺少定义:
typedef _signal_base+n<mt_policy> base;
typedef typename base::connections_list connections_list;
using base::m_connected_slots;

输出:

==correct slot==

==wrong slot==


参考