事件驱动框架允许程序处理外部事件,如网络连接、文件I/O、超时和信号。事件驱动框架可以让程序通过回调函数处理不同的事件,回调函数可以在事件触发时立即被调用。
要实现一个简单事件驱动框架,首先需要创建一个事件处理函数,它是根据发生的不同事件调用不同的回调函数。然后,我们需要编写代码来注册事件的回调函数,即当某个事件发生时就要调用该回调函数。
直接开干:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <pthread.h> //定义事件类型 typedef enum EventType_t { EVENT_TEST_A = 0, EVENT_TEST_B, EVENT_TEST_C, EVENT_ALL_NUM }EventType_t; //定义事件处理函数类型 typedef void (*EventHandler_t)(EventType_t type, void *pArg); //定义事件对象 typedef struct Event_t { EventType_t type; EventHandler_t handler; void *pArg; }Event_t; //事件列表 Event_t EventList[EVENT_ALL_NUM] = {0}; //注册事件并将事件以及事件处理函数等添加到事件列表中 void RegisterEvent(EventType_t type, EventHandler_t handler, void *pArg) { if (type >= EVENT_ALL_NUM) { printf("Invalid event type!\n"); return; } EventList[type].type = type; EventList[type].handler = handler; EventList[type].pArg = pArg; } //根据具体的某个事件调用对应的事件触发函数 void TriggerEvent(EventType_t type) { if (type >= EVENT_ALL_NUM) { printf("Invalid event type!\n"); return; } if (EventList[type].handler != NULL) { EventList[type].handler(type, EventList[type].pArg); } } //对应事件A的处理函数 void HandlerEventTestA(EventType_t type, void *pArg) { printf("HandlerEventTestA is called!\n"); } //对应事件B的处理函数 void HandlerEventTestB(EventType_t type, void *pArg) { printf("HandlerEventTestB is called!\n"); } void *ThreadHandler(void *Arg) { while(1) { //触发事件A TriggerEvent(EVENT_TEST_A); usleep(1000*1000); //触发事件B TriggerEvent(EVENT_TEST_B); usleep(1000*1000); } } int main(void) { pthread_t Thread; //注册事件A & B RegisterEvent(EVENT_TEST_A, HandlerEventTestA, NULL); RegisterEvent(EVENT_TEST_B, HandlerEventTestB, NULL); pthread_create(&Thread, NULL, ThreadHandler, NULL); pthread_detach(Thread); while(1) { usleep(2000 * 10); } return 0; }
编译程序:
gcc test.c -o test -lpthread
运行结果:
往期精彩
开源:AliOS_Things_Developer_Kit开发板复活计划
开源按键组件MultiButton支持菜单操作(事件驱动型)
手把手教你在STM32上实现OLED视频播放(很简单也很硬很肝!)
一些值得被定义为常用C语言头文件库的漂亮宏定义(值得收藏,以备使用参考)