webRTC base模块SigSlot信号与槽实现

来源:互联网 发布:淘宝跳蚤街在哪 编辑:程序博客网 时间:2024/06/09 16:52

SigSlot

非常经典的信号/槽结构 在Qt中同样存在信号/槽机制用于通讯

Qt下信号/槽

QT signal/slot http://blog.csdn.net/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

SigSlot的实现