# eventhandler_lite **Repository Path**: smabear_admin/eventhandler_lite ## Basic Information - **Project Name**: eventhandler_lite - **Description**: 参考鸿蒙的eventhandler,实现轻量的eventhandler,在原因功能基础上,引入定时操作等功能 - **Primary Language**: C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-01-31 - **Last Updated**: 2024-01-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # eventhandler_lite #### 介绍 参考鸿蒙的eventhandler,实现轻量的eventhandler,在原因功能基础上,引入定时操作等功能 #### 软件架构 一 eventhandleropenharmony eventhandler提供了线程间的通讯机制,其主要实现的功能是将业务的计算与逻辑控制解耦,换句话说是实现eventhandler可以解决将程序种耗时且不紧急的部分放到另外的线程去处理,从来提供本线程执行的流畅程度;其主要包括以下几个类:**关键核心类****功能简介**EventHandler发送和处理消息的核心类,通过绑定一个EventRunner对象实现对消息队列进行循环分发的能力;EventRunner消息队列的循环分发器,每个EventRunner都有一个对应的线程,用于管理消息队列EventQueue,不断地从EventQueue中取出InnerEvent事件对象分发至对应的EventHandler进行处理(也可以通过回调函数直接处理)InnerEvent线程之间消息传递的实体,EventHandler接收与处理的消息事件对象。InnerEvent对象的优先级可设为IMMEDIATE、HIGH、LOW、IDLE几种类型,并可设置合适的延迟处理参数delayTime,确保业务在合适的时间开始处理该事件;EventQueue线程消息队列,管理InnerEvent;在创建EventRunner对象时必须创建一个与之关联的EventQueue,用于EventRunner中新建线程存储管理InnerEvent事件对象;IoWaiter消息提供了消息处理的触发;在EventQueue与eventRunner之间提供了触发的轮子;分别又condition与epoll2种触发方式;需要实现condition或者epoll的类来实现;其工作关系如下:![img](https://uploader.shimo.im/f/E6RX7T4DjwmrRZEv.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3MDY3MTA1NzcsImZpbGVHVUlEIjoibTRrTU1Qbk9XMGl2T1lrRCIsImlhdCI6MTcwNjcxMDI3NywiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjoyNTcxMTkwfQ.0hFHtbtUIPccpvK907RPNCAFjgdQSq2nf3v8zHBtfAs)其中eventque实现了 immediate hight low idle4种优先级。handler在投递innerevent的时候需要实体化queue与runner,并需要投递到对应的对列。在实现队列收到投递后触发io_waiter的notify eventRunder种队列的接收部分在在收到notify后触发runner醒来工作;eventhandler是作为一个线程处理的附属来存在,每个主线程在处理耗时任务的时候可以初始化一个evenrunner的实例来启动工作。对于回调的处理在eventhandler的 DistributeEvent方法种来实现;eventhandler的DistributeEvent 又被eventrunner的run方法来调用;主要类图如下:![img](https://uploader.shimo.im/f/DevTlys3WVe4OXQ7.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3MDY3MTA1NzcsImZpbGVHVUlEIjoibTRrTU1Qbk9XMGl2T1lrRCIsImlhdCI6MTcwNjcxMDI3NywiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjoyNTcxMTkwfQ.0hFHtbtUIPccpvK907RPNCAFjgdQSq2nf3v8zHBtfAs)evnethandler的几个关键设计:1evnethandler提供给 使用者创建handler,并绑定一个queue.2eventhandler通过post 或者send发送一个innerevent的实例同时会触发notify;3eventrunner在被触发唤醒后,执行DistributeEvent;4在执行DistributeEvent,对于延时操作的回调需要判断时间是否到;二eventhandler_lite 版本设计需求:a.考虑lite版本的内存空间,不适合每个延后处理的任务都创建一个任务;b,满足对任务的延时处理;再没有独立使用任务处理延时任务的情况下,需要考虑时效性;c,满足事件的订阅发布;f,足够的解构,需要满足扩展关键设计:1eventhandler需要满足延后任务的设计与订阅发布的能力2对于延时任务的处理采用时间轮来加快处理流程3runner的创建对立出来;4topic组题支持扩展,支持二进制与字符串的方式,字符串的方式支持/组合多级domain;5lite版本只支持condition6订阅发布支持过滤器,过滤器分为入口过滤与出口过滤;(待定)![img](https://uploader.shimo.im/f/L1XSAOHUdGmatt8a.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3MDY3MTA1NzcsImZpbGVHVUlEIjoibTRrTU1Qbk9XMGl2T1lrRCIsImlhdCI6MTcwNjcxMDI3NywiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjoyNTcxMTkwfQ.0hFHtbtUIPccpvK907RPNCAFjgdQSq2nf3v8zHBtfAs) A线程可能要处理的任务:1立即执行-》 queue->runner2延时,定时,超时->wheel->runner3订阅发布->broker->runner 订阅者 发布者eventloop的这样的基于事件消息处理的一个事件触发触发 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)