SigSlot
非常经典的信号/槽结构 在Qt中同样存在信号/槽机制用于通讯
Qt下信号/槽
QT signal/slot http://blog.youkuaiyun.com/qq_21358401/article/details/78736796
SigSlot的应用
SigSlot的构成比较复杂但应用非常简单 所以这里先分析其用法
总结起来就两点
以两参数的signal2为例
1. 利用
sigslot::signal2<string,string> signal_;
string str1, str2;
利用既定的信号模板 指定要通过信号发送的数据类型
并在要发送信号时 signal_(str1, str2);
2. 接收类需要继承 class test : public sigslot::has_slots<> {
void recv(string msg1, string msg2) {
cout << "rcv 1:" << msg1 << "rcv 2:" << msg2 << endl;
}
}
非常简单的调用 和Qt中的信号与槽并无区别
完整示例代码
#include <iostream>
#include <queue>
#include <memory>
#include <string>
#include <csignal>
#include "pthread.h"
#include "webrtc/base/sigslot.h"
using namespace std;
class sender {
public:
sigslot::signal2<string, char *> signal_;
char str[20];
char a;
void send() {
static int val = 0;
snprintf(str, 20, "%s", "sliver.chen");
printf("my address is 0x%x\n", &a);
signal_(this->str, &a);
}
};
class recver : public sigslot::has_slots<> {
public:
void OnDanger(string msg, char *p) {
cout << msg << endl;
printf("addr:%x\n", p);
}
};
int main(int argc, char **argv) {
int ret = 0;
sender s;
recver r;
s.signal_.connect(&r, &recver::OnDanger);
int i = 0;
while (i++ < 10) {
s.send();
}
return 0;
}
示例代码还验证了一个规则:信号与槽发送的数据是拷贝的 故而如果想要传递数据 可以通过传递数据的指针来实现.
参考代码git地址:
sigslot 参考代码 https://github.com/sliver-chen/webRTCTutorial/blob/master/SigSlot/SigSlot.cpp