事件路由

Posted linhaostudy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了事件路由相关的知识,希望对你有一定的参考价值。

1. 概述

业务软件设计开发过程中会依赖一些基础组件, 事件路由就是常见的基础组件。 本模块结合业务场景, 定制了一个基本的事件路由模块。

本文主要介绍了事件路由模块及其使用方法, 用于指导用户开发。

2. 架构原理

事件路由模块, 提供了一种事件分发的框架。 用户可以自己定义事件以及事件的处理策略。 具体系统框图组成及对外接口关系如图 15-1 所示。

图15-1 事件路由模块系统框图

技术图片

概括来说, 事件路由模块主要由以下部分构成:

  • 订阅者

用户自定义订阅者: 订阅者名称, 事件处理函数, 用户扩展参数, 事件是否同步处理。

  • 事件定义

用户自定义事件:事件 ID, 参数 1, 参数 2, 处理结果, 创建时间, 负载。

  • 事件发布

支持事件统一发布。

  • 事件处理者

订阅者支持异步处理事件, 内部启动线程独立处理。

  • 历史事件

支持上一次事件的查询。

3. API 参考

该功能模块为用户提供以下 API:

  • HI_EVTHUB_Init: 初始化事件路由模块。
  • HI_EVTHUB_Deinit: 去初始化事件路由模块。
  • HI_EVTHUB_Register: 注册事件。
  • HI_EVTHUB_UnRegister: 解注册事件。
  • HI_EVTHUB_Publish: 发布事件。
  • HI_EVTHUB_CreateSubscriber: 创建订阅者。
  • HI_EVTHUB_DestroySubscriber:销毁订阅者。
  • HI_EVTHUB_Subscribe: 订阅事件。
  • HI_EVTHUB_UnSubscribe:解订阅事件。
  • HI_EVTHUB_GetEventHistory:获取历史事件。
  • HI_EVTHUB_SetEnabled:设置使能标记。
  • HI_EVTHUB_GetEnabled:获取使能标记。

HI_EVTHUB_Init

【描述】

初始化事件路由模块。

【定义】

HI_S32 HI_EVTHUB_Init();

【参数】

无。

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

该模块是单实例, 仅需一次初始化。

【举例】

无。

HI_EVTHUB_Deinit

【描述】

去初始化事件路由模块。

【定义】

HI_S32 HI_EVTHUB_Deinit();

【参数】

无。

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_Register

【描述】

注册事件。

【定义】

HI_S32 HI_EVTHUB_Register(HI_EVENT_ID EventID);

【参数】
参数名称 | 描述 | 输入/输出
--- | ---| ---
EventID| 事件 ID。| 输入

【返回值】
返回值| 描述
---| ---
0 | 成功。
非 0 | 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_UnRegister

【描述】

解注册事件。

【定义】

HI_S32 HI_EVTHUB_UnRegister(HI_EVENT_ID EventID);

【参数】

参数名称 描述 输入/输出
EventID 事件 ID。 输入

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_Publish

【描述】

发布事件。

【定义】

HI_S32 HI_EVTHUB_Publish(HI_EVENT_S *pEvent);

【参数】

参数名称 描述 输入/输出
pEvent 事件指针。 输入

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_CreateSubscriber

【描述】

创建订阅者。

【定义】

HI_S32 HI_EVTHUB_CreateSubscriber(HI_SUBSCRIBER_S pstSubscriber,HI_MW_PTR ppSubscriber);

【参数】

参数名称 描述 输入/输出
pstSubscriber 订阅者参数。 输入
ppSubscriber 订阅者句柄指针。 输出

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_DestroySubscriber

【描述】

销毁订阅者。

【定义】

HI_S32 HI_EVTHUB_DestroySubscriber(HI_MW_PTR pSubscriber);

【参数】
参数名称| 描述| 输入/输出
---|---|---
pSubscriber| 订阅者句柄。| 输入

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

HI_EVTHUB_Subscribe

【描述】

订阅事件。

【定义】

HI_S32 HI_EVTHUB_Subscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

【参数】

参数名称 描述 输入/输出
pSubscriber 订阅者句柄。 输入
EventID 事件 ID。 输入

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_UnSubscribe

【描述】

解订阅事件。

【定义】

HI_S32 HI_EVTHUB_UnSubscribe(HI_MW_PTR pSubscriber,HI_EVENT_ID EventID);

【参数】

参数名称 描述 输入/输出
pSubscriber 订阅者句柄。 输入
EventID 事件 ID。 输入

【返回值】
返回值| 描述
---|---
0 | 成功。
非 0 | 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_GetEventHistory

【描述】

获取历史事件。

【定义】

HI_S32 HI_EVTHUB_GetEventHistory(HI_S32 EventID,HI_EVENT_S *pEvent);

【参数】

参数名称 描述 输入/输出
EventID 事件 ID。 输入
pEvent 事件指针。 输出

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_SetEnabled

【描述】

设置使能标记。

【定义】

HI_S32 HI_EVTHUB_SetEnabled(HI_BOOL bFlag);

【参数】
参数名称 | 描述| 输入/输出
---|---|---
bFlag | 使能标记。| 输入

【返回值】

返回值 描述
0 成功。
非 0 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

HI_EVTHUB_GetEnabled

【描述】

获取使能标记。

【定义】

HI_S32 HI_EVTHUB_GetEnabled(HI_BOOL *pFlag);

【参数】
参数名称| 描述| 输入/输出
---| ---|---
pFlag | 使能标记指针。| 输出

【返回值】
返回值 | 描述
---|---
0 | 成功。
非 0 | 失败,参见错误码。

【需求】

  • 头文件: hi_eventhub.h
  • 库文件: libeventhub.a/ libeventhub.so

【注意】

无。

【举例】

无。

4. 数据类型

事件路由模块相关数据类型定义如下:

  • EVENT_PAYLOAD_LEN: 事件负载数据最大长度。
  • HI_EVTHUB_SUBSCRIBE_NAME_LEN: 订阅者名称最大长度。
  • HI_EVTHUB_MESSAGEQURUR_MAX_SIZE: 消息队列最大值。
  • HI_EVENT_ID: 事件 ID。
  • HI_EVENT_S: 事件结构体。
  • HI_SUBSCRIBER_S: 订阅者结构体。

EVENT_PAYLOAD_LEN

【说明】

事件负载数据最大长度。

【定义】

#define EVENT_PAYLOAD_LEN (512)

【注意事项】

无。

【相关数据结构及接口】

无。

HI_EVTHUB_SUBSCRIBE_NAME_LEN

【说明】

订阅者名称的最大长度。

【定义】

#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)

【注意事项】

无。

【相关数据类型及接口】

HI_EVTHUB_SUBSCRIBE_NAME_LEN

【说明】

订阅者名称的最大长度。

【定义】

#define HI_EVTHUB_SUBSCRIBE_NAME_LEN (16)

【注意事项】

无。

【相关数据类型及接口】

HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

【说明】

消息队列最大值。

【定义】

#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)

【注意事项】

无。

【相关数据类型及接口】

无。

HI_EVTHUB_MESSAGEQURUR_MAX_SIZE

【说明】

消息队列最大值。

【定义】

#define HI_EVTHUB_MESSAGEQURUR_MAX_SIZE (32)

【注意事项】

无。

【相关数据类型及接口】

无。

HI_EVENT_S

【说明】

定义事件结构体。

【定义】

typedef struct hiEVENT_S

    HI_EVENT_ID EventID;
    HI_S32 arg1;
    HI_S32 arg2;
    HI_S32 s32Result;
    HI_U64 u64CreateTime;
    HI_CHAR aszPayload[EVENT_PAYLOAD_LEN];
 HI_EVENT_S;

【成员】

成员名称 描述
EventID 事件 ID
arg1 参数一
arg2 参数二
s32Result 处理结果
u64CreateTime 创建时间
aszPayload 负载数据

【注意事项】

创建时间在事件发布时, 由模块内部获取系统 clock 时间填充, 单位秒/s。

【相关数据类型及接口】

HI_SUBSCRIBER_S

【说明】

定义订阅者结构体。

【定义】

typedef struct hiSUBSCRIBER_S

    HI_CHAR azName[HI_EVTHUB_SUBSCRIBE_NAME_LEN];
    HI_S32 (*HI_EVTHUB_EVENTPROC_FN_PTR)(HI_EVENT_S* pEvent, HI_VOID* argv);
    HI_VOID* argv;
    HI_BOOL bSync;
HI_SUBSCRIBER_S;

【成员】
成员名称 | 描述
---|---
azName| 订阅者名称。
HI_EVTHUB_EVENTPROC_FN_PTR| 订阅者事件处理函数。
argv| 用户定义私有参数指针。
bSync| 事件处理是否同步。

【注意事项】

无。

【相关数据类型及接口】

无。

5 错误码

事件路由模块 API 错误码如表 15-1 所示。

表15-1 事件路由 API 错误码

错误代码 宏定义 描述
0xA1328002 HI_ERR_EVTHUB_NULL_PTR 空指针错误
0xA1328008 HI_ERR_EVTHUB_NOT_INIT 未初始化错误
0xA1328040 HI_ERR_EVTHUB_HANDLE_INVALID 非法句柄错误。
0xA1328041 HI_ERR_EVTHUB_INVALIDARG 非法参数
0xA1328042 HI_ERR_EVTHUB_MALLOC 内存申请错误
0xA1328043 HI_ERR_EVTHUB_CREATE 创建错误
0xA1328044 HI_ERR_EVTHUB_DESTROY 销毁错误
0xA1328045 HI_ERR_EVTHUB_NOT_CREATE 对象没有创建
0xA1328046 HI_ERR_EVTHUB_EVENT_NO_RIGEST 事件未注册
0xA1328047 HI_ERR_EVTHUB_NO_EVENT_HISTORY 历史事件不存在
0xA1328048 HI_ERR_EVTHUB_MSGHDL_SEND 事件路由消息发送错误

以上是关于事件路由的主要内容,如果未能解决你的问题,请参考以下文章

WPF的路由事件冒泡事件隧道事件(预览事件)

WPF路由事件二:路由事件的三种策略

事件路由

WPF--路由事件

路由事件

2021-09-22 WPF上位机 38-路由事件