加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

實(shí)現(xiàn)一個簡單的事件驅(qū)動處理框架

2023/06/09
2290
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來源 | 嵌入式應(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é)果:

 

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
AFBR-79EQDZ 1 Foxconn Transceiver, 840nm Min, 860nm Max, MTP Connector, Panel Mount, ROHS COMPLIANT, PACKAGE-38
$113.6 查看
CSTNE10M0G550000R0 1 Murata Manufacturing Co Ltd Ceramic Resonator,

ECAD模型

下載ECAD模型
$0.65 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本科畢業(yè)于華南理工大學(xué),現(xiàn)美國卡羅爾工商管理碩士研究生在讀,曾就職于世界名企偉易達(dá)、聯(lián)發(fā)科技等,多年嵌入式產(chǎn)品開發(fā)經(jīng)驗(yàn),在智能玩具、安防產(chǎn)品、平板電腦、手機(jī)開發(fā)有豐富的實(shí)戰(zhàn)開發(fā)經(jīng)驗(yàn),現(xiàn)任深圳市云之手科技有限公司副總經(jīng)理、研發(fā)總工程師。