firemail
标题:
基于观察者模式的事件通知系统
[打印本页]
作者:
Qter
时间:
2025-8-2 13:56
标题:
基于观察者模式的事件通知系统
# notify.cpp代码功能分析
这段代码实现了一个基于观察者模式的事件通知系统,主要用于在应用程序的不同组件之间进行事件传递和处理。以下是详细分析:
## 核心数据结构
```cpp
static QMap<enum NotifyType, QList<std::pair<notify_function_t, void *> > > g_notifys;
static QReadWriteLock * s_lock = ForceNew<QReadWriteLock>();
```
- `g_notifys`:一个全局映射表,键为通知类型(NotifyType枚举),值为回调函数列表
- 每个回调函数以`std::pair<notify_function_t, void *>`形式存储,包含函数指针和上下文数据
- `s_lock`:读写锁,用于保护对`g_notifys`的并发访问
## 主要函数
### 1. ExecNotify函数
```cpp
void BASE_API ExecNotify(enum NotifyType ntype, int event, void *data)
```
功能:触发特定类型的通知事件
- 参数:
- `ntype`:通知类型(如LOGIN_NOTIFY, MAIL_NOTIFY等)
- `event`:事件ID(如MAILLIST_EVENT等)
- `data`:事件相关数据
- 实现流程:
1. 使用读锁查找指定类型的通知回调函数列表
2. 如果找不到该类型的通知,直接返回
3. 复制回调函数列表(避免在遍历过程中修改列表)
4. 遍历列表并调用每个回调函数,传入事件ID、数据和上下文
### 2. 重载的ExecNotify函数
```cpp
void ExecNotify(int event, void *data)
```
功能:使用默认通知类型(DEFAULT_NOTIFY)触发事件
### 3. AddNotify函数
```cpp
void BASE_API AddNotify(enum NotifyType ntype, notify_function_t func, void *context)
```
功能:注册回调函数到指定通知类型
- 参数:
- `ntype`:通知类型
- `func`:回调函数指针(类型为`void (*)(int event, void* data, void *content)`)
- `context`:上下文数据,会在调用回调函数时传入
- 实现:使用写锁将回调函数和上下文添加到对应通知类型的列表中
### 4. DeleteNotify函数(代码片段中未完全显示)
功能:从所有通知类型中移除指定的回调函数
### 5. DeleteAllNotify函数(代码片段中未完全显示)
功能:清空所有注册的通知回调函数
## 线程安全
- 使用QReadWriteLock保证在多线程环境下对g_notifys的安全访问
- 读操作(ExecNotify)使用QReadLocker
- 写操作(AddNotify, DeleteNotify, DeleteAllNotify)使用QWriteLocker
## 应用场景
这种通知机制常用于:
1. 解耦组件间的通信
2. 实现事件驱动的架构
3. 处理异步操作的结果通知
在这个应用中,它被用于处理各种系统事件,如登录通知、邮件通知、地址簿变更通知等,使不同模块能够响应这些事件而不需要直接依赖其他模块。
欢迎光临 firemail (http://firemail.wang:8088/)
Powered by Discuz! X3