系列文章目录
《ZLToolKit源码学习笔记》(1)VS2019源码编译
《ZLToolKit源码学习笔记》(2)工具模块之日志功能分析
《ZLToolKit源码学习笔记》(3)工具模块之终端命令解析
《ZLToolKit源码学习笔记》(4)工具模块之消息广播器(本文)
《ZLToolKit源码学习笔记》(6)线程模块之整体框架概述
《ZLToolKit源码学习笔记》(7)线程模块之线程池组件:任务队列与线程组
《ZLToolKit源码学习笔记》(8)线程模块之线程负载计算器
《ZLToolKit源码学习笔记》(9)线程模块之任务执行器
《ZLToolKit源码学习笔记》(11)线程模块之工作线程池WorkThreadPool
《ZLToolKit源码学习笔记》(12)事件轮询模块之整体框架概述
《ZLToolKit源码学习笔记》(13)事件轮询模块之管道的简单封装
《ZLToolKit源码学习笔记》(14)事件轮询模块之定时器
《ZLToolKit源码学习笔记》(15)事件轮询模块之事件轮询器EventPoller
《ZLToolKit源码学习笔记》(16)网络模块之整体框架概述
《ZLToolKit源码学习笔记》(17)网络模块之基础接口封装类SockUtil
《ZLToolKit源码学习笔记》(18)网络模块之Buffer缓存
《ZLToolKit源码学习笔记》(19)网络模块之套接字封装
《ZLToolKit源码学习笔记》(20)网络模块之TcpServer
《ZLToolKit源码学习笔记》(21)网络模块之TcpClient与Session
《ZLToolKit源码学习笔记》(22)网络模块之UdpServer
前言
消息广播器相关功能对应NoticeCenter.h和NoticeCenter.cpp文件。
目录
一、使用
使用示例参见test_noticeCenter.cpp文件。可以为一个事件添加多个监听者。
//监听NOTICE_NAME2事件
NoticeCenter::Instance().addListener(0,NOTICE_NAME2,
[](string &d,double &c,const char *&b,int &a)
{
DebugL << a << " " << b << " " << c << " " << d;
NoticeCenter::Instance().delListener(0,NOTICE_NAME2);
NoticeCenter::Instance().addListener(0,NOTICE_NAME2,
[](string &d,double &c,const char *&b,int &a)
{
WarnL << "事件2的第1个监听者:" << a << " " << b << " " << c << " " << d;
});
});
//监听NOTICE_NAME2事件
NoticeCenter::Instance().addListener("1",NOTICE_NAME2,
[](string &d,double &c,const char *&b,int &a)
{
DebugL << a << " " << b << " " << c << " " << d;
NoticeCenter::Instance().delListener("1",NOTICE_NAME2);
NoticeCenter::Instance().addListener("1",NOTICE_NAME2,
[](string &d,double &c,const char *&b,int &a)
{
WarnL << "事件2的第2个监听者:" << a << " " << b << " " << c << " " << d;
});
});
//触发事件
NoticeCenter::Instance().emitEvent(NOTICE_NAME2,d,c,b,a);
二、源码结构分析
该部分功能由EventDispatcher和NoticeCenter两个类实现,EventDispatcher负责事件分发,最终将事件通知到每一个监听者,NoticeCenter用于管理事件。
两者关系如下:
NoticeCenter可以管理多个事件,每一个事件对应一个EventDispatcher事件分发器对象,所有对该事件的监听者由EventDispatcher维护。
NoticeCenter管理事件,EventDispatcher管理事件的监听者。
2.1、事件管理:NoticeCenter
该类是一个单例类,持有以下方法:
//触发事件,通知监听者动作最终是在该事件的分发器中完成
template<typename ...ArgsType>
int emitEvent(const string &strEvent, ArgsType &&...args);
/*添加事件监听者,如果该事件之前没有被管理,则为该事件分配一个事件分发器对象,添加监听者,并把该事件添加到map中管理。
如果已经被管理,则获取到该事件对应的事件分发器,把新的监听者添加进去。
*/
template<typename FUNC>
void addListener(void *tag, const string &event, FUNC &&func);
/*删除指定事件的指定监听者
如果事件被删除监听者后,没有其它的监听者,则删除该事件。
*/
void delListener(void *tag, const string &event);
/*根据监听者标签,删除监听者。因为不知道该监听者监听的是哪个事件,所以需要将所有事件全部遍历一遍,性能比较差
如果事件被删除监听者后,没有其它的监听者,则删除该事件。
*/
void delListener(void *tag);
//删除所有事件
void clearAll();
2.2、事件分发器:EventDispatcher
该类的构造函数是私有的,所以类外不能直接实例化该类的对象,只能通过它的友元类NoticeCenter访问。
emitEvent负责通知事件的监听者,该函数是阻塞式的,直到所有监听者通知完成才返回。
//触发事件
template<typename ...ArgsType>
int emitEvent(ArgsType &&...args);
//为该事件添加一个监听者
template<typename FUNC>
void addListener(void *tag, FUNC &&func);
//删除该事件的一个监听者,第二个参数返回该事件是否还有监听者,如果没有,NoticeCenter中将会删除该事件。
void delListener(void *tag, bool &empty);