libjingle使用sigslot library实现对象之间的通信。sigslot是一个开源的回调框架,它可以使得类之间的回调使用的简单化。
sigsolt源码下载地址:http://sigslot.sourceforge.net/
sigsolt的优点:
(1)不用担心空回调,当回调对象析构时会自动disconnect
(2)支持多线程,线程安全,有锁
sigsolt的缺点:
(1)只能回调void类型函数,不支持返回值
(2)slot没有优先级,不能动态调整回调队列中的先后顺序
slot函数(被回调的函数)就是普通的成员函数, 但有以下限制
(1)返回值必须为void,可修改代码取消该限制
(2)Slot参数个数范围为0-8个, 可修改代码取消该限制
(3)实现slot的类必须继承自has_slots<>,这是sigslot的机制基础,必须遵守,除非你自己重新写个sigslot
实例:
#include <iostream>
#include <ctime>
#include <string>
#include "sigslot.h"
class Sender
{
public:
sigslot::signal2<std::string, std::time_t> SignalDanger;
void Panic()
{
SignalDanger("Help", std::time(0));
}
};
class Receiver :public sigslot::has_slots <>
{
public:
Receiver(Sender& sender)
{
sender.SignalDanger.connect(this, &Receiver::OnDanger);
}
void OnDanger(std::string message, std::time_t time)
{
if (message == "Help")
{
std::cout << "Call the police" << std::endl;
}
}
};
int main()
{
Sender sender;
Receiver receiver(sender);
sender.Panic();
system("PAUSE");
}