实现一个简单的事件驱动处理框架

news2024/11/29 7:56:40

点击上方“嵌入式应用研究院”,选择“置顶/星标公众号

干货福利,第一时间送达!

来源 | 嵌入式应用研究院

整理&排版 | 嵌入式应用研究院

事件驱动框架允许程序处理外部事件,如网络连接、文件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

运行结果:

d67627415b9b018817490d486cd84b89.png

往期精彩

分享GitHub上一些嵌入式相关的高星开源项目

开源:AliOS_Things_Developer_Kit开发板复活计划

一种可用于单片机的中断高效处理与事件机制方法

开源按键组件MultiButton支持菜单操作(事件驱动型)

手把手教你在STM32上实现OLED视频播放(很简单也很硬很肝!)

回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?

一些值得被定义为常用C语言头文件库的漂亮宏定义(值得收藏,以备使用参考)

基于事件型表驱动法菜单框架之小熊派简易气体探测器实战项目开发(中)

觉得本次分享的文章对您有帮助,随手点[在看]并转发分享,也是对我的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/626395.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置office和wps的数学公式编辑工具Mathtype7.4

一、概述 《数学公式编辑器(MathType)》 是一款专业的数学公式编辑工具&#xff0c;理科生专用的工具。mathtype公式编辑器能够帮助用户在各种文档中插入复杂的数学公式和符号。 数学公式编辑器工具可以轻松输入各种复杂的公式和符号&#xff0c;与Office文档完美结合&#xff…

imu预积分处理

VINS-Mono是HKUST的Shen Shaojie团队开源的一套非常优秀的Visual-Inertial融合定位算法。关于算法的介绍以及论文可以通过此链接查看。 IMU、ˆω和ˆa的原始陀螺仪和加速度计测量值由下式给出&#xff1a; 在车身坐标系测量的IMU测量结合了抗重力和平台动力学的力&#xff0c…

[蓝桥杯 2018 国 B] 矩阵求和

题目描述 经过重重笔试面试的考验&#xff0c;小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表&#xff1a; 表有 n 行 n 列&#xff0c;行和列的编号都从 1 算起。 其中第 ii 行第 jj 个元素的值是 gcd(i,j) 的平方&#xff0c;gcd 表示最大公约数&#xf…

什么样的电容笔好用?好用的平板触控笔

现在使用电容笔的人越来越多了&#xff0c;尤其学生党和上班族&#xff0c;可以使用电容笔来提高生产效率&#xff0c;这个时候电容笔的书写流畅度就非常重要&#xff0c;今天给大家介绍四款平价又好用的电容笔。跟我来看看吧&#xff01; 一、使用电容笔的用途&#xff1a; …

四、LLC 谐振变换器

变换器实现 ZVS 的限制 全面了解LLC谐振变换器实现ZVS的条件&#xff0c;把变换器主电路变形成图所示形式。其中 Coss1、Coss2分别为开关管 S1、S2 漏-源极间的寄生电容&#xff0c;并且Coss1Coss2 Coss 。Cstray为与谐振网络并联的等效寄生电容&#xff0c;则变换器在 ZVS 条…

【数据恢复、安全和备份解决方案】上海道宁与LSoft为企业提供先进的技术来处理现代数据安全和保存问题

需要备份和恢复磁盘、 恢复已删除的文档和照片、 安全擦除磁盘、 监控硬盘健康状况、 甚至在Windows 无法正常启动时修复 PC&#xff1f; Active Data Studio是 一组桌面应用程序 和可引导CD/DVD或USB磁盘 用于将任何系统引导至 Windows恢复环境 开发商介绍 LSoft Te…

MySQL数据库 – node使用

1 MySQL查询对象 2 MySQL查询数组 3 mysql2库介绍使用 4 mysql2预处理语句 5 mysql2连接池使用 6 mysql2的Promi 这里仅说明如何使用服务器连接数据库并进行操作。 预处理语句就是可以输入变量的语句&#xff08;表现形式是有符号&#xff1a;&#xff1f;&#xff09;。需…

计算机网络管理-SNMP网络管理中遇到的问题及解决

启动网络发现的网络拓扑呈现错误 在实验中我发现&#xff0c;进入SNMPc 工具后&#xff0c;因为先前我是开启了网络发现的功能的&#xff0c;因此程序会自动生成拓补图&#xff0c;自动生成的网络规划是错误的&#xff0c;如下图所示&#xff1a; 我的设备&#xff1a;cdypc没…

手机号码在网时长 API 探索:精准营销与用户洞察

随着移动互联网的蓬勃发展&#xff0c;手机在网时长成为评估用户活跃度和风险控制的关键指标。手机号码在网时长 API 提供了查询手机号在网时长、判断活跃程度以及个性化推荐和优惠等功能&#xff0c;为企业实现精准营销、有效风险控制和深入用户洞察提供了有力支持。 本文将深…

pnpm v8.6 正式发布,软件包管理器

导读pnpm 是一个快速、节省磁盘空间的软件包管理器。它使用一个内容可寻址的文件系统来存储磁盘上所有模块目录的所有文件。当使用 npm 或 Yarn 时&#xff0c;如果你有 100 个使用 lodash 的项目&#xff0c;你将在磁盘上有 100 份 lodash 的拷贝&#xff0c;而使用 pnpm 时&a…

分类树,我从2s优化到0.1s

前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 但就是这样一个简单的分类树查询功能&#xff0c;我们却优化了5次。 到底是怎么回事呢&#xff1f; 背景 我们的网站使用了SpringBoot推荐的模板引擎&#xff1a;Thymelea…

保经济、促创新,汽车行业综合采购(系统)数智化解决方案

汽车行业是中国国民经济的支柱产业&#xff0c;公安部数据显示&#xff0c;我国平均每百户家庭拥有汽车达到60辆。广阔的市场为行业带来大量需求&#xff0c;以及激烈的市场竞争&#xff1b;同时我国汽车产业正处在从传统工业时代向数字时代迈进的关键时期&#xff0c;急需创新…

【Rust日报】2023-06-07 使用 C++ 编写通用库并在 Rust 中使用它 (WASI)

使用 C 编写通用库并在 Rust 中使用它 (WASI) WebAssembly 简介 WebAssembly 是一种二进制指令格式&#xff0c;旨在成为一种低级虚拟机&#xff0c;可以在 Web 浏览器中以接近本机的速度运行代码。它不特定于网络&#xff0c;也可以在其他平台上运行。WebAssembly 代码可以从各…

【嵌入式环境下linux内核及驱动学习笔记-(15-1)例程】

目录 1、在APP直接调用标准文件IO操作I2C(针对学习笔记-15的15.3节)1.1 mail.c1.2 mpu6050.h1.3 mpu6050.c1.4 Makefile 2、以外称id的方式进行匹配的i2c驱动2.1 mpu6050.h2.2 mpu6050_i2c_client.c2.3 mpu6050_i2c_driver.c2.4 read_mpu.c 测试的应用层APP2.5 Makefile 3、以设…

Python3数据分析与挖掘建模(10)复合分析-交叉分析与实现示例

1. 复合分析 1.1 概述 复合分析&#xff08;Factorial Analysis&#xff09;是一种统计分析方法&#xff0c;用于研究多个因素对观测结果的影响&#xff0c;并探究各个因素之间的相互作用效应。 在复合分析中&#xff0c;研究者会选择多个因素&#xff08;也称为处理变量或独…

武汉涉密系统集成资质保密制度涵盖哪些内容

涉密信息系统集成资质申请其中最核心的就是保密制度管理&#xff0c;这里面涉及到保密管理的方方面面&#xff0c;现场审查也是围绕保密制度建设内容来打分的。申报单位应当建立规范、操作性强的保密制度&#xff0c;并根据实际情况及时修订完善。保密制度的具体要求应当体现在…

highlight clock tree

当分析clock tree需要在图形界面highlight clock tree时&#xff0c;最朴实无华的方法就是贴报告&#xff0c;除此之外这里也分享一下用命令的方法。 1.Imported Path Pins 1&#xff09;Highlight > Color By > Imported Path Pins 2&#xff09;report_timing icc2…

智慧园区物业可视化大屏

随着万物互联、数字信息时代的到来&#xff0c;也给物业园区管理行业带来变革性影响。 园区作为城市的基本组成单元&#xff0c;是人口和产业的重要聚集区&#xff0c;现已逐渐成为中国经济转型升级和创新发展的主力。 智慧园区物业可视化整合园区现有信息系统的数据资源&#…

OpenStack部署(四)

OpenStack部署 8. Dashboard8.1 安装并配置8.2 重启web服务器以及会话存储服务8.3 浏览器访问配置 9. Designate9.1 创建Designate数据库并授权9.2 获得admin凭证9.3 创建designate用户并设置密码9.4 添加admin角色到designate用户9.5 创建designate服务实体9.6 创建designate服…

【计算机组成与体系结构Ⅰ】章节测试(1-3)

下列是计算机中几种常见的机器数编码&#xff1a; ①原码 ②反码 ③补码 零的表示唯一的是&#xff08; &#xff09; A&#xff0e;仅③ B&#xff0e;② C&#xff0e;①、② D&#xff0e;①、③ 下列采用偶校验的8位奇偶校验编码中正确的是&#xff08; &#xff09;…