《ZLToolKit源码学习笔记》(4)工具模块之消息广播器

 系列文章目录

《ZLToolKit源码学习笔记》(1)VS2019源码编译

《ZLToolKit源码学习笔记》(2)工具模块之日志功能分析

《ZLToolKit源码学习笔记》(3)工具模块之终端命令解析

《ZLToolKit源码学习笔记》(4)工具模块之消息广播器(本文)

《ZLToolKit源码学习笔记》(5)工具模块之资源池

《ZLToolKit源码学习笔记》(6)线程模块之整体框架概述

《ZLToolKit源码学习笔记》(7)线程模块之线程池组件:任务队列与线程组

《ZLToolKit源码学习笔记》(8)线程模块之线程负载计算器

《ZLToolKit源码学习笔记》(9)线程模块之任务执行器

《ZLToolKit源码学习笔记》(10)线程模块之线程池

《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文件。


目录

系列文章目录

前言

一、使用

二、源码结构分析

2.1、事件管理:NoticeCenter

2.2、事件分发器:EventDispatcher


一、使用

使用示例参见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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秦时小

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值