文章目录

  • 简介
  • 代码
    • 模板实现:
    • 测试代码
    • 运行结果

简介

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 signals2 coroutine

    signals2 观察者模式, 解耦模块 class Button {typedef boost::signals2::signal<void (int x, int y)> OnClic ...

  2. Bitcoin代码中的Boost signals(1)

    1. signal 事件定义 类型CMainSignals 来统一管理各个功能模块的事件通知,CMainSignal 是一个资源管理类型, 主要工作代理给由unique_ptr 管理内存的成员 m_i ...

  3. Boost signals(1) 基本介绍

    Boost.Signals实现了signals/slots模式,信号(signals)被发射,而插槽(slots)接收该信号.插槽可以是任意的可调用对象,包括函数指针.函数对象,以及它们的 bind/ ...

  4. boost第 4 章 事件处理

    http://zh.highscore.de/cpp/boost/ 1.信号 Signals 2.一旦对象 被销毁,连接就会自动释放. 让 FF类继承自 boost::signals::trackab ...

  5. boost::signals2::trackable相关的测试程序

    boost::signals2::trackable相关的测试程序 实现功能 C++实现代码 实现功能 boost::signals2::trackable相关的测试程序 C++实现代码 #inclu ...

  6. boost::signals2::shared_connection_block相关的测试程序

    boost::signals2::shared_connection_block相关的测试程序 实现功能 C++实现代码 实现功能 boost::signals2::shared_connection ...

  7. boost::signals2模块实现将参数从信号调用传递到槽的示例程序

    boost::signals2模块实现将参数从信号调用传递到槽的示例程序 实现功能 C++实现代码 实现功能 boost::signals2模块实现将参数从信号调用传递到槽的示例程序 C++实现代码 ...

  8. boost::signals2模块实现用于从槽返回值到信号调用的示例程序

    boost::signals2模块实现用于从槽返回值到信号调用的示例程序 实现功能 C++实现代码 实现功能 boost::signals2模块实现用于从槽返回值到信号调用的示例程序 C++实现代码 ...

  9. boost::signals2模块实现显示插槽通过接口传递的示例程序

    boost::signals2模块实现显示插槽通过接口传递的示例程序 实现功能 C++实现代码 实现功能 boost::signals2模块实现显示插槽通过接口传递的示例程序 C++实现代码 #inc ...

最新文章

  1. 麦肯锡:物联网九大应用潜力无限 2025年经济价值高达11.1万亿美元
  2. struts文件异常Included file cannot be found
  3. php 本地mysql 代码_基于本地数据库的 IP 地址查询 PHP 源码
  4. scrapy 中爬取时被重定向_一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程...
  5. Java中发送结构体
  6. [09-01]JavaScript 基础语法
  7. 用python写linux中的ls,Python实现Linux环境下的ls命令
  8. 早期访问中具有NetBeans的Oracle公共云Java服务
  9. java日期函数精确到日,java日期时间函数分享
  10. Android应用开发(1)---Android五大UI布局的特有属性
  11. [转]UART 基础知识
  12. Java基础练习之流程控制(一)
  13. C++常用数据类型和Windows常见数据类型
  14. 古建筑测绘任重道远,三维实景建模是唯一突破口?
  15. word文档批量给图片添加题注
  16. 互联网晚报 | 11月3日 星期三 | 头条西瓜等业务并入抖音;菜鸟联合天猫上亿元补贴快递员;雅虎宣布正式退出中国市场...
  17. 各种复杂网络处理工具
  18. 使用Navicat 设定 sql 触发器
  19. 转载:80端口、443端口、8080端口、8000端口的区别
  20. 木马编程入门_逆向入门分析实战(一)

热门文章

  1. 【THREE源码解析篇】THREE.Sprite详解
  2. SVA16.14并发断言翻译笔记$inferred_clock和$inferred_disable(六)
  3. 饿了么口碑发布“暖冬计划”PK美团,降低费率让利商家
  4. 网吧管理员技术资料-转的
  5. Pathon安装教程环境配置教程(Pathon2.7和3.7的区别)
  6. Python:混合动力汽车能量管理_动态规划简版(2/2)
  7. asp.net968-基于Web的校园二手图书交易平台#毕业设计
  8. 京东云PostgreSQL在GIS场景的应用分享
  9. SAP 标准成本、目标成本与实际成本
  10. [滴滴校招] 连续最大和