來源 | 嵌入式應(yīng)用研究院
事件驅(qū)動框架允許程序處理外部事件,如網(wǎng)絡(luò)連接、文件I/O、超時和信號。事件驅(qū)動框架可以讓程序通過回調(diào)函數(shù)處理不同的事件,回調(diào)函數(shù)可以在事件觸發(fā)時立即被調(diào)用。
要實(shí)現(xiàn)一個簡單事件驅(qū)動框架,首先需要創(chuàng)建一個事件處理函數(shù),它是根據(jù)發(fā)生的不同事件調(diào)用不同的回調(diào)函數(shù)。然后,我們需要編寫代碼來注冊事件的回調(diào)函數(shù),即當(dāng)某個事件發(fā)生時就要調(diào)用該回調(diào)函數(shù)。
直接開干:
#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;
//定義事件處理函數(shù)類型
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};
//注冊事件并將事件以及事件處理函數(shù)等添加到事件列表中
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;
}
//根據(jù)具體的某個事件調(diào)用對應(yīng)的事件觸發(fā)函數(shù)
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);
????}
}
//對應(yīng)事件A的處理函數(shù)
void?HandlerEventTestA(EventType_t?type,?void?*pArg)
{
????printf("HandlerEventTestA?is?called!n");
}
//對應(yīng)事件B的處理函數(shù)
void?HandlerEventTestB(EventType_t?type,?void?*pArg)
{
????printf("HandlerEventTestB?is?called!n");
}
void?*ThreadHandler(void?*Arg)
{
? while(1)
? {
?? //觸發(fā)事件A
?? TriggerEvent(EVENT_TEST_A);
?? usleep(1000*1000);
?? //觸發(fā)事件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
運(yùn)行結(jié)果: