前言:
最近做项目,需要封装库,为了更好的移植性,打算将部分内容不使用QT环境,但是又想使用信号和槽,怎么办呢?发现一个东西:sigslot库。
下载地址:
轻量级消息架构sigslot库_sigslot库资源-CSDN文库
参考文章:
【学习笔记】开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)_multi_threaded_local-CSDN博客
简单Demo:
步骤:
1. 创建工作类:内部有信号对象。
2. 创建槽类:内部有槽函数
3. 绑定信号:worker.sig_start.connect(&tips, &Tips::on_start);
#include <iostream>
#include <thread>
#include "sigslot.h"
using namespace std;
using namespace sigslot;
class Worker
{
public:
// 定义几个信号对象:
signal0<> sig_start; // 开始的时候
signal1<string> sig_error; // 报错的时候
signal2<int,string> sig_end; // 结束的时候
public:
void run()
{
cout<<"start..."<<endl;
sig_start.emit();
this_thread::sleep_for(chrono::seconds(1));
cout<<"error..."<<endl;
sig_error.emit("network error: 500");
this_thread::sleep_for(chrono::seconds(1));
cout<<"end..."<<endl;
sig_end.emit(1,"succeed!!!");
}
};
class Tips : public has_slots<>
{
public:
void on_start()
{
cout<<"Tips: start..."<<endl;
}
void on_error(string tips)
{
cout<<"Tips: error "<<tips<<endl;
}
void on_end(int num, string tips)
{
cout<<"Tips: end. error:"<<num<<" result:"<<tips<<endl;
}
};
int main()
{
// 创建对象:
Worker worker;
Tips tips;
// 关联信号:
worker.sig_start.connect(&tips, &Tips::on_start);
worker.sig_error.connect(&tips, &Tips::on_error);
worker.sig_end.connect(&tips, &Tips::on_end);
// 运行
worker.run();
return 0;
}
结果: