事件服务文档
事件服务器是一种异步事件处理机制,它通过事件散发和回调的形式,能够无效地进步零碎的异步解决能力、解耦性和可扩展性。
事件服务器蕴含两个次要组件:事件服务器和事件客户端。
- 事件服务器用于接管和散发事件,它外部保护一个事件队列用于存储待处理事件和一个事件列表用于存储注册的事件客户端。
- 事件客户端用于解决特定类型的事件,它须要注册到事件服务器并提供一个回调函数。
当事件产生时,事件服务器会将事件插入到其事件队列中进行缓存。事件服务器会周期性地从事件队列中取出事件进行散发,找到对应的事件客户端,而后调用其注册的回调函数进行事件处理。
事件服务原型
/* 事件服务器 */struct event_server{ struct event_fifo queue; /* 事件队列 */ event_avl_t list; /* 事件链表 */};
- queue:事件队列(用于存储要唤醒的客户端ID)。
- list:服务器链表(用于存储客户端)。
/* 事件客户端 */struct event_client{ struct event_avl list; /* 事件链表 */ mr_err_t (*cb)(event_server_t server, void *args); /* 事件回调函数 */ void *args; /* 事件回调函数参数 */};
- list:客户端链表(用于将客户端增加到服务器的客户端列表中)。
- cb:回调函数。
- args:回调函数参数。
初始化服务器
int event_server_init(mr_event_server_t server,mr_size_t queue_length);
参数 | 形容 |
---|---|
server | 服务器句柄 |
queue_length | 服务器队列长度(同时处理事件的个数) |
返回 | |
EVENT_ERR_OK | 增加胜利 |
错误码 | 增加失败 |
重置服务器
int event_server_uninit(event_server_t server);
参数 | 形容 |
---|---|
server | 服务器句柄 |
返回 | |
EVENT_ERR_OK | 移除胜利 |
错误码 | 移除失败 |
告诉服务器,事件产生
int event_server_notify(event_server_t server, uint8_t id);
参数 | 形容 |
---|---|
server | 服务器句柄 |
id | 产生事件的客户端id |
返回 | |
EVENT_ERR_OK | 告诉胜利 |
错误码 | 告诉失败 |
服务器散发事件,唤醒客户端
void event_server_handle(event_server_t server);
参数 | 形容 |
---|---|
server | 服务器句柄 |
查找客户端
event_client_t event_client_find(uint8_t id, event_server_t server);
参数 | 形容 |
---|---|
id | 客户端id |
server | 服务器句柄 |
返回 | |
客户端句柄 | 查找胜利 |
NULL | 查找失败 |
创立新客户端
int event_client_create(uint8_t id, int (*cb)(event_server_t server, void *args), void *args, event_server_t server);
参数 | 形容 |
---|---|
id | 客户端id |
cb | 回调函数 |
args | 回调函数参数 |
server | 服务器句柄 |
返回 | |
EVENT_ERR_OK | 创立胜利 |
错误码 | 创立失败 |
删除客户端
int client_delete(uint8_t id, event_server_t server);
参数 | 形容 |
---|---|
id | 客户端id |
server | 服务器句柄 |
返回 | |
EVENT_ERR_OK | 删除胜利 |
错误码 | 删除失败 |
应用示例:
/* 定义事件 */#define EVENT1 1#define EVENT2 2#define EVENT3 3/* 定义事件服务器 */struct event_server event_server;int event1_cb(event_server_t server, void *args){ printf("event1_cb\r\n"); /* 告诉事件服务器事件2产生 */ event_server_notify(server, EVENT2); return 0;}int event2_cb(event_server_t server, void *args){ printf("event2_cb\r\n"); /* 告诉事件服务器事件3产生 */ event_server_notify(server, EVENT3); return 0;}int event3_cb(event_server_t server, void *args){ printf("event3_cb\r\n"); return 0;}int main(void){ /* 增加事件服务器到内核容器 */ event_server_init(&event_server, 4); /* 创立事件客户端到事件服务器 */ event_client_create(EVENT1, event1_cb, NULL, &event_server); event_client_create(EVENT2, event2_cb, NULL, &event_server); event_client_create(EVENT3, event3_cb, NULL, &event_server); /* 告诉事件服务器事件1产生 */ event_server_notify(&event_server, EVENT1); while (1) { event_server_handle(&event_server); }}
景象:
event1_cbevent2_cbevent3_cb
----------
下载代码(门路:mr-library/ package / event)
----------
许可协定
遵循 Apache License 2.0 开源许可协定,可收费利用于商业产品,无需公开公有代码。