简介

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. keepalived 热备

    概述 keepalived高可用集群      keepalived最初是为了LVS的,因为LVS无法进行自动检测服务器的节点状态(可以自动部署LVS)     keeplived后来加入VRRP给功 ...

  2. Pop!_OS安装与配置(二):基础配置

    Pop!_OS相关使用配置 #0x0 书接上回 #0x1 换源 #0x10 nopasswd sudo #0x11 换国内源 0x2 安装应用 #0x0 书接上回 首先请看上一章末尾, Pop!_OS ...

  3. HangFire多集群切换及DashBoard登录验证

    项目中是有多个集群的,现在存在一个是:在切换web集群时,如何切换HangFire的周期性任务. 先采取的解决办法是: 每个集群分一个队列,在周期性任务入队时分配当前web集群的集群id单做队列名称. ...

  4. js常见删除绑定的事件

    1. elem.onclick = null / false;  //直接解除 例子如下: var div = document.getElemetById('id'); div.onclick = ...

  5. 三、Python系列——Pandas数据库读取数据

    Pandas主要先读取表格类型的数据,然后进行分析. import pandas as pd# 由于是用pandas模块操作数据,因此不用在路径前加open,否则就是python直接打开文件,可能还会 ...

  6. 索引中丢失 IN 或 OUT 参数:: 103,解决办法

    索引中丢失  IN 或 OUT 参数:: 103 这个原因是数据库中的字段类型与SQL语句中的类型不匹配造成的,103代表第103个字段参数错误.找到对应参数配置或者SQL中这个参数的类型是否与数据库 ...

  7. Burp Suite Scanner Module - 扫描模块

    Burp Suite Professional 和Enterprise Version的Scaner功能较丰富. 以Professional版本为例,包含Issue activity, Scan qu ...

  8. Eclipse点击空格总是自动补全代码怎么办,如何自动补全代码,代码提示

    Eclipse点击空格总是自动补全不想要的代码说明大家配置的时候出现了一点错误,下面的步骤将会解决它, 网上部分经验需要大家更改代码非常繁琐,下面是一个简单的步骤方法 步骤一:打开eclipse依次点 ...

  9. Lua骚操作——三元条件运算符

    本文地址:https://www.cnblogs.com/oberon-zjt0806/p/13337577.html 本文参考了这篇文章 三元运算符 (如果您已经了解什么是三元运算符,请大胆第前往下 ...

  10. AndroidStudio查找硬编码的String字符串

    在Menu的“Analyze”中,选择“Run Inspection By Name”,然后输入“Hardcoded strings”,执行后,可以找到所有没有加入strings.xml的字符串. 按 ...