用回调函数实现一个数据通讯模型
今天周五,没有什么事就用回调实现一个简单的数据通讯模型,先解释下基本概念。回调函数:一个通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
函数指针模型:void(FP*)(),下面我们就用函数指针来实现简单的回调函数。
一般来说,我们接受message的类并不直接处理业务逻辑,一般将业务逻辑交给另外一个类处理,那怎么样在接收到message的类里面要接受到消息就立即调用业务逻辑类的相应函数那?其实方法很多,这里主要学习通过回调机制实现,下面直接上代码:
#include <iostream> using namespace std; class CDataComunication { public: typedef void(*CallbackFunc)(int event); enum callbackID //实践ID,可以在接收到MSG时做为回调的参数。 { DATA_A, DATA_B, DATA_C, DATA_NUM }; ~CDataComunication(){} static CDataComunication& getInstance(void) //简单的单例,这里暂时不考虑多线程 { static CDataComunication datacomun; return datacomun; } bool registerCallBackFunc(CallbackFunc callback) //注册回调函数 { bool flag = false; if(NULL != callback) { m_callback = callback; flag = true; } return flag; } void TestCallback(int test) //这个主要是为了测试回调函数,如果在实际项目中,可以是接受其他线程或进程的message的入口 { (*m_callback)(test); } private: CDataComunication():m_callback(NULL) //构造函数私有 { } private: CallbackFunc m_callback; }; class CDataProcess { private: CDataComunication& m_dateComun; public: CDataProcess():m_dateComun(CDataComunication::getInstance()){} static void execCallBack(int event) //处理回调事件 { switch(event) { case CDataComunication::DATA_A: cout<<"execCallBack AA"<<endl; break; case CDataComunication::DATA_B: cout<<"execCallBack BB"<<endl; break; case CDataComunication::DATA_C: cout<<"execCallBack CC"<<endl; break; default: break; } } void init(void) { m_dateComun.registerCallBackFunc(execCallBack); } }; int main(int argc, char** argv) { CDataProcess dataProcess; dataProcess.init(); //初始化 CDataComunication dataCom = CDataComunication::getInstance(); dataCom.TestCallback(1); //这个主要是为了测试回调函数,如果在实际项目中,可以是接受其他线程或进程的message的入口 return 0; }
下面是测试结果:
Do one thing at a time,and do well.