首页 > 其他分享 >实现一个简单的时间驱动处理框架

实现一个简单的时间驱动处理框架

时间:2023-06-09 09:44:30浏览次数:35  
标签:pArg 框架 EventType void 事件 简单 驱动 type EVENT

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

运行结果:

 

点击查看代码 ``` ```

标签:pArg,框架,EventType,void,事件,简单,驱动,type,EVENT
From: https://www.cnblogs.com/stave/p/17468285.html

相关文章

  • 9.3 Django框架
    Django是一个非常流行的PythonWeb开发框架,它是完整且强大的,适用于构建大型Web应用。在这一章节中,我们将详细介绍Django的基本概念、组件和用法。为了便于理解,我们将使用实例来展示如何使用Django构建一个简单的Web应用。9.3.1安装和创建Django项目首先,使用pip......
  • 移动语义的简单示例
    下面是一个使用移动语义的简单示例:#include<iostream>#include<string>classMyString{public:MyString():m_data(nullptr),m_size(0){}MyString(constchar*str):MyString(){m_size=strlen(str);m_data=newchar[m_size+1......
  • laravel框架接口
    下面是增删改查的接口,在使用过程中按自己需求对代码进行更改控制器代码<?phpnamespaceApp\Http\Controllers;useApp\Models\Fang;useIlluminate\Http\Request;useNette\Schema\ValidationException;classFangControllerextendsController{//房源添加......
  • Java Kafka简单地将Map对象序列化为json
    最近用到kafka,想简单地把Map对象序列化为json发送到主题,直接用string序列化,生成的结果不是json,虽然格式很像,key都没有引号,可能是直接调用的toString方法。但是网上搜了一圈,都是spring组合或者其他不太简单的方案。在哔站看了一段视频受到启发,就实现了一个自定义json序列化类,......
  • 云原生时代Go最受欢迎Web开源框架Gin原理与实战
    @目录概述定义特点概览导图使用快速入门HTTP方法使用参数获取参数绑定自定义日志输出自定义中间件路由组HTML渲染设置和获取CookieXML、YAML、ProtoBuf渲染使用BasicAuth中间件静态文件和BootStrap使用Session写入日志文件原理核心执行流程核心数据结构概述定义Gin官网地址......
  • 02-MyBatis-CRUD-配置文件、参数封装、mybatisX插件、动态sql, 简单的用注解开发
    文章目录MybatisCRUD练习1,配置文件实现CRUD1.1环境准备Debug01:别名mybatisx报错1.2查询所有数据1.2.1编写接口方法1.2.2编写SQL语句1.2.3编写测试方法1.2.4起别名解决上述问题1.2.5使用resultMap解决上述问题1.2.6小结1.3查询详情1.3.1编写接口方法1.3.2编写SQL语句......
  • 关于HTML 5文档结构的简单案例
    在HTML文档的开头,一般会有一个文档类型声明(DOCTYPE)。在HTML5中,文档类型声明为<!DOCTYPEhtml>(注意大小写)。因此,如果一个网页的文档类型声明为<!DOCTYPEhtml>,那么这个网页就是采用了HTML5。但需要注意的是,并不是所有的网页都需要文档类型声明。如果一个网页没有文档类型声明,也不......
  • XPath 简单语法
    XPath是XML的查询语言,和SQL的角色很类似。以下面XML为例,介绍XPath的语法。<?xmlversion="1.0"encoding="ISO-8859-1"?><catalog><cdcountry="USA"><title>EmpireBurlesque</title><artist>BobDylan</arti......
  • Mybatis的配置与简单使用
    Mybatis的开发步骤官网入门手册中说明如下:创建项目加入依赖执行SQLXMLXML配置文件中包含了对MyBatis系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)获得SqlSessionFactoryBuilder获得SqlS......
  • Java高级技术、Junit单元测试框架入门
          ......