Signals、sigslot简介

 

在复杂的工程中,整个系统被分为数个模块,每个模块提供有限的功能,由上层调用从而组成整个系统,为了保证每个模块的独立性,我们经常限制模块与模块之间直接联系,每个模块只提供有限的API或Com接口,内部完全封装起来。

有时候两个不同的逻辑层的模块需要通信,如果直接include头文件会使项目变的复杂,sigslot的出现为我们提供了一种解决问题的思想,它用“信号”的概念实现不同模块之间的传输问题,sigslot本身类似于一条通讯电缆,两端提供发送器和接收器,只要把两个模块用这条电缆连接起来就可以实现接口调用,而sigslot本身只是一个轻量级的作品,整个库只有一个.h文件,所以无论处于何种层次的库,都可以非常方便的包含它。

#include "third_party/libjingle/source/talk/base/sigslot.h"

class Sender 
 {
 public:
     // 定义信号,该信号有两个参数
     sigslot::signal2< std::string , int > SignalDanger;
    
     // 该函数发送消息
     void Panic()
     {
         SignalDanger("Help!", 0);
     }
 };

class Receiver : public sigslot::has_slots<>
 {
 public:
     // 接收SignalDanger 信号的函数,该函数参数必须和信号的参数一致
     void OnDanger(std::string message, int time)
     {
         printf("I heard something like \"%s\" at %d!n", message.c_str(), time);
     }
 };

Sender sender;
Receiver receiver;
// 将发送者的信号连接到接收方的接收函数上;和断开连接
sender.SignalDanger.connect(&receiver, &Receiver::OnDanger);
sender.Panic();
sender.SignalDanger.disconnect(&receiver);

 

只要在任何时候调用sender.Panic()函数,就会把求救信号发送给接收者,而且这两个发送和接收端的模块都可以独立编译,不会出现版本问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值