简介

boost是C++的一个扩展库,被称为C++准标准库,里面的组件很丰富,并且引用方便,85%的组件只需要引用头文件即可使用。

并且在嵌入式系统也可以很方便的使用,这里介绍一下signal的使用,有点类似Qt里的信号槽。

可以接收静态函数、类成员函数、labmda表达式。

下面这个是使用signal封装的一个事件注册处理模板,使用起来还是很方便的。

代码

模板实现:
#ifndef __EVENT_PROC_H__
#define __EVENT_PROC_H__
#include <iostream>
#include <map>
#include <string>
#include <boost/bind.hpp>
#include "boost/signals2.hpp" using namespace std; #ifndef RTN_FAIL
#define RTN_FAIL -1
#endif #ifndef RTN_SUCCESS
#define RTN_SUCCESS 0
#endif /*----------------------------------类定义-----------------------------------*/
template <typename TypeEvent, typename TypeFunc ,typename TypeFnData, typename TypeFnDataLen>
class TSEventProc
{
public:
TSEventProc() {}
~TSEventProc() {}
int RegEvent(TypeEvent tpEvent, TypeFunc func); // 注册处理函数
int ProcEvent(TypeEvent tpEvent, TypeFnData tpData, TypeFnDataLen tpDataLen); // 处理指令数据 typedef boost::signals2::signal<void(TypeEvent,TypeFnData, TypeFnDataLen)> EventSignal; protected:
map< TypeEvent, EventSignal*> m_mpEventProcMap; // 命令字与处理函数映射表
}; /*----------------------------------类实现-----------------------------------*/
//事件注册
template <typename TypeEvent,typename TypeFunc, typename TypeFnData, typename TypeFnDataLen>
int TSEventProc< TypeEvent, TypeFunc,TypeFnData, TypeFnDataLen>::RegEvent(TypeEvent tpEvent, TypeFunc func)
{
typename map< TypeEvent, EventSignal* >::iterator iter = m_mpEventProcMap.find(tpEvent);
if( iter != m_mpEventProcMap.end() )
{
iter->second->connect(func);
}
else
{
m_mpEventProcMap[tpEvent] = new EventSignal;
m_mpEventProcMap[tpEvent]->connect(func);
} return RTN_SUCCESS;
} //事件处理
template <typename TypeEvent, typename TypeFunc,typename TypeFnData, typename TypeFnDataLen>
int TSEventProc<TypeEvent, TypeFunc,TypeFnData, TypeFnDataLen>::ProcEvent(TypeEvent tpEvent, TypeFnData tpData, TypeFnDataLen tpDataLen)
{
EventSignal *pEventSignal = NULL;
typename map< TypeEvent, EventSignal*>::iterator iter = m_mpEventProcMap.find(tpEvent);
if(iter != m_mpEventProcMap.end())
{
pEventSignal = iter->second;
(*pEventSignal)(tpEvent,tpData,tpDataLen);
}
else
{
cout<<"in ProcEvent, Can't find cmd ["<<tpEvent<<"] process function."<<endl;
return RTN_FAIL;
} return RTN_SUCCESS;
} #endif /* __EVENT_PROC_H__ */
测试代码
#include <QCoreApplication>
#include <iostream> using namespace std; #include "event_proc.h"
#include "boost/bind.hpp" typedef boost::function<void(string, const void *, int)> MSG_FUNCTION3; //测试用的处理函数
void TestCmd(string event,const void * pData, int iLen)
{
char *pcData = (char *)pData;
cout<<"TestCmd: event: "<<event<<endl; if (pcData)
printf("dev: %d, cmd: %d,dataLen: %d\n", pcData[0], pcData[1],iLen);
return;
} //测试用的处理函数
void TestCmd1(string event,const void * pData, int iLen)
{
char *pcData = (char *)pData;
cout<<"TestCmd1: event: "<<event<<endl; if (pcData)
printf("dev: %d, cmd: %d,dataLen: %d\n", pcData[0], pcData[1],iLen);
return;
} //测试用类
class testFuncObject
{
public:
void TestFunc(string event,const void * pData, int iLen)
{
cout<<"testFuncObject::TestFunc: event: "<<event<<endl; char *pcData = (char *)pData;
if (pcData)
printf("testFuncObject::TestFunc, dev: %d, cmd: %d,dataLen: %d\n", pcData[0], pcData[1],iLen);
}
}; int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); TSEventProc <string, MSG_FUNCTION3,const void*, int> eventMgr;
char Data[32] = {0}; //使用静态函数
eventMgr.RegEvent("event1",TestCmd);
eventMgr.RegEvent("event1",TestCmd1);
eventMgr.RegEvent("event2",TestCmd); //使用lambda表达式
eventMgr.RegEvent("event2",[](string event,const void * pData, int iLen){
cout<<"use labmda: event: "<<event<<endl;
}); //测试使用类成员函数
testFuncObject testobj;
eventMgr.RegEvent("event2",boost::bind(&testFuncObject::TestFunc, &testobj, _1,_2,_3)); Data[0] = 31;
Data[1] = 2;
//event1事件处理
eventMgr.ProcEvent("event1", Data, (int)sizeof(Data));
Data[1] = 3;
//event2事件处理
eventMgr.ProcEvent("event2", Data, (int)sizeof(Data)); return a.exec();
}

上面测试代码是在qt的工程里写的,所以有 QCoreApplication a(argc, argv); 和 a.exec();

运行结果
TestCmd: event: event1
dev: 31, cmd: 2,dataLen: 32
TestCmd1: event: event1
dev: 31, cmd: 2,dataLen: 32
TestCmd: event: event2
dev: 31, cmd: 3,dataLen: 32
use labmda: event: event2
testFuncObject::TestFunc: event: event2
testFuncObject::TestFunc, dev: 31, cmd: 3,dataLen: 32

boost之signal的使用的更多相关文章

  1. boost::signals::signal的使用方法

    吃力的讲完boost::signals的ppt.然后接着就是做练习题. 通过讲ppt,发现有一句话说的真好:你自己知道是一回事.你能给别人讲明确又是另外一回事.真的有些东西你自己理解,可是用语言去非常 ...

  2. boost之signal

    boost里的signal是一个模板类,不区分信号种类,产生信号统一用()调用操作符. 1.回调普通函数代码示例: #include <iostream> #include <str ...

  3. Boost信号/槽signals2

    信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便.项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定. signa ...

  4. c++中的signal机制

    简介 signal是为了解决类之间通信的问题而出现的,更深入的原因是面向对象讲究封装,但是封装必然导致类之间沟通困难,但是使用接口的方式又太重量级--需要写很多代码,而且会导致接口爆炸 比如你需要把一 ...

  5. BOOST::Signals2

    /* Andy is going to hold a concert while the time is not decided. Eric is a fans of Andy who doesn't ...

  6. 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)

    记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...

  7. boost事件处理

    尽管这个库的名字乍一看好象有点误导,但实际上并不是如此. Boost.Signals 所实现的模式被命名为 '信号至插槽' (signal to slot).它基于下面概念:当相应的信号被发出时.相关 ...

  8. boost------signals2的使用1(Boost程序库完全开发指南)读书笔记

    signals2基于Boost的另一个库signals,实现了线程安全的观察者模式.在signals2库中,观察者模式被称为信号/插槽(signals and slots),他是一种函数回调机制,一个 ...

  9. boost------signals2的使用2(Boost程序库完全开发指南)读书笔记

    1.应用于观察者模式 本小节将使用signals2开发一个完整的观察者模式示例程序,用来演示信号/插槽的用法.这个程序将模拟一个日常生活场景:客人按门铃,门铃响,护士开门,婴儿哭闹. Ring.h: ...

随机推荐

  1. include文件包含漏洞

    发现allow_url_include 是on状态 既然已经直接包含了phpinfo()是文件,首先搜索了一下allow_url_include,发现是处于打开的状态. 既然 allow_url_in ...

  2. 精通java并发-synchronized关键字和锁

    目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages synchronized关键字和锁 示例代码 public class MyThreadTest2 { public ...

  3. kafka 监控工具 eagle 的安装(内附高速下载地址)

    简介 如图 kafka eagle 是可视化的 kafka 监视系统,用于监控 kafka 集群 环境准备: 需要的内存:1.5G+ 支持的 kafka 版本:0.8.2.x,0.9.x,0.10.x ...

  4. git的撤销、删除和版本回退

    目录 备注: 知识点: 查看git仓库的状态 查看历史记录. 版本回退 备注: 本文参考于廖雪峰的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文. 知识点: 1.git ...

  5. kubernetes系列(十六) - Helm安装和入门

    1. helm简介 1.1 为什么需要helm 1.2 helm中几个概念 1.3 helm用途 2. helm安装 3. helm的基本使用 3.1 安装chart仓库里面的chart 3.2 创建 ...

  6. Go的100天之旅-02基本语法

    基本语法 Go关键字 下面是Go的25个关键字: break default func interface select case defer go map struct chan else goto ...

  7. Qt-可视化数据库操作

    1  简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=89 说明:Qt可使用QSqlTableModel来进行数据库的可视化操作,将mode ...

  8. 关于node-sass安装失败问题

    在进行Vue开发中npm run dev报错,按照提示尝试进行npm以及cnpm安装均失败 解决办法:npm uninstall node-sass卸载模块 指定淘宝镜像源安装 npm i node- ...

  9. SQL Server数据类型对应.Net Core中的数据类型

    SQL C# bigint(sql大小:8byte) long(64位) int, integer(sql大小:4byte) int(32位) smallint(sql大小:2byte) short( ...

  10. ElasticSearch(二)Kibana、版本控制

    Kibana简介: Kibana可视化界面 Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作. 你用Kibana来搜索,查看,并和存储在Elasticsearch ...