《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);

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Libevent是一个事件驱动的网络编程框架,而event.h是其核心头文件之一。该头文件定义了事件处理相关的结构体、函数和宏等内容。 下面是event.h中常用的一些定义和函数: ### 1.事件回调函数 ```c typedef void (*event_callback_fn)(evutil_socket_t fd, short events, void *arg); ``` 该类型定义了事件回调函数的原型,其中fd是事件所在的文件描述符,events是事件类型,arg是用户传入的参数。 ### 2.事件结构体 ```c struct event { event_callback_fn ev_callback; // 事件回调函数 int ev_fd; // 事件所在的文件描述符 short ev_events; // 事件类型 short ev_res; // 事件结果 struct event_base *ev_base; // 事件所属的event_base void *ev_arg; // 用户传入的参数 }; ``` 该结构体表示一个事件,其中ev_callback是事件回调函数,ev_fd是事件所在的文件描述符,ev_events是事件类型,ev_res是事件结果,ev_base是事件所属的event_base,ev_arg是用户传入的参数。 ### 3.事件类型 ```c #define EV_TIMEOUT 0x01 #define EV_READ 0x02 #define EV_WRITE 0x04 #define EV_SIGNAL 0x08 #define EV_PERSIST 0x10 #define EV_ET 0x20 ``` 该宏定义了事件类型,分别为超时事件、读事件、写事件、信号事件、持续事件和边缘触发事件。 ### 4.事件处理函数 ```c struct event_base *event_base_new(void); int event_base_dispatch(struct event_base *base); int event_base_loopexit(struct event_base *base, const struct timeval *tv); void event_base_free(struct event_base *base); ``` 这些函数用于创建event_base、处理事件、退出事件循环和释放event_base等操作。 以上是event.h中的一些常用内容,更多细节可以查看源码和官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秦时小

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

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

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

打赏作者

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

抵扣说明:

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

余额充值