Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 53|回复: 0
打印 上一主题 下一主题

基于观察者模式的事件通知系统

[复制链接]

1329

主题

2151

帖子

8437

积分

认证用户组

Rank: 5Rank: 5

积分
8437
跳转到指定楼层
楼主
发表于 2025-8-2 13:56:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


# 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. 处理异步操作的结果通知

在这个应用中,它被用于处理各种系统事件,如登录通知、邮件通知、地址簿变更通知等,使不同模块能够响应这些事件而不需要直接依赖其他模块。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2025-8-15 20:50 , Processed in 0.057708 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表