背景介绍
相信做过界面编程的人都会对事件回调机制不陌生。事件的概念抽象了对象间的通讯机制,解耦了不同类型互相强引用的情况,将对象的关系用一种类似连接电话线的方式简化。而实现一套事件系统却不简单。通常我们需要满足的案例情况:
a.静态函数和成员函数(当然c不需要考虑成员函数)
b.在事件被派发过程中如果产生了解注册,系统不能崩溃
c.是否考虑多线程
d.事件系统通常需要一个事件被多个函数注册的情况
基本思路
我们设计时仅考虑简化了的情况,我们将以链表保存注册函数。需要考虑派发过程中的解注册。
以智能指针管理链表节点的内存,就可以达到安全延后释放的目标。
// Simplified EventSet for c.
//
// 1. Only support the one static function signature.
// int(*func)(void*, struct mmEventArgs*);
//
// 2. Supports nested event. During the process of handling an event, a listener
// can safely dispatch event and Subscribe/UnSubscribe other listeners.
//
// 3. Subscribe always insert tail.
//
// 4. Not thread safety.
//
// 5. Only support string for event name.
//
// 6. Not support delete the running EventSet at event callback.
1.最终使用案例
https://bitbucket.org/mm_longcheng/mm-core/src/dev/mm/src/core/mmEventSet.h
int HandlerFunc0(void* obj, struct mmEventArgs* evt)
{
printf("handle 0\n");
return MM_FALSE;
}
int HandlerFunc1(void* obj, struct mmEventArgs* evt)
{
struct mmEventSet* p = (struct mmEventSet*)(obj);
mmEventSet_UnSubscribeEvent(p, "Name", &HandlerFunc0, p);
printf("handle 1\n");
return MM_FALSE;
}

本文介绍了事件回调机制的基本概念和在界面编程中的应用,详细阐述了一个简化版的事件系统设计,包括静态函数和成员函数的支持、事件处理过程中的解注册安全性、单线程环境的考虑以及字符串事件名的使用。通过链表存储注册函数并使用智能指针确保内存安全。在实际案例中展示了事件的订阅、解订阅和派发流程,同时提供了关键的数据结构和处理函数的实现细节。
最低0.47元/天 解锁文章
265

被折叠的 条评论
为什么被折叠?



