CN108958717A - C++事件总线实现方法 - Google Patents
C++事件总线实现方法 Download PDFInfo
- Publication number
- CN108958717A CN108958717A CN201810689005.8A CN201810689005A CN108958717A CN 108958717 A CN108958717 A CN 108958717A CN 201810689005 A CN201810689005 A CN 201810689005A CN 108958717 A CN108958717 A CN 108958717A
- Authority
- CN
- China
- Prior art keywords
- event
- type
- consumer
- handled
- template structure
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及软件技术领域。所提供的C++事件总线实现方法,包括以下步骤:创建获取消费者所能处理事件的类型的模板结构体;通过所述模板结构体获取消费者所能处理的事件的类型;建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;将所述映射表保存在事件总线中;将第一事件发送至事件总线;根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;将所述第一事件发送至所匹配到的消费者。该C++事件总线实现方法具有很高的灵活性、易用性,具体表现如下:1.不限制事件的类型;2.支持生产者产生的事件的数量和类型在运行时和消费者进行匹配;3.支持运行时检测。
Description
技术领域
本发明涉及软件技术领域,具体涉及C++事件总线实现方法。
背景技术
对于软件模块之间的功能调用,传统的方式是通过直接调用软件模块里面 的接口来实现的;这种方法的优点是调用者和被调用者明确,但是缺点也是非 常明显的,模块之间具有很高的耦合度,使得软件在开发以及后期维护、扩展 上非常不利。
通过事件总线调用模块的方式很好的避免传统模块调用存在的问题。
目前在C++里面实现事件总线的方法普遍是预先规定消费者接收事件的参 数的数量和类型,由此需要预先规定所有事件的参数的数量和类型,从而导致 不能做到运行时检测,灵活度很低。这也是目前事件总线在C++的应用率没有 其他语言高的原因之一。
因此,提高C++事件总线的灵活度(不限制事件的生产者和消费者的编写 格式以及支持运行时的检测)是很有必要的。
发明内容
本发明的目的在于提供更具灵活性以及易用性的C++事件总线实现方法。
为此,本发明采用以下方案:
C++事件总线实现方法,包括以下步骤:
创建获取消费者所能处理事件的类型的模板结构体;
通过所述模板结构体获取消费者所能处理的事件的类型;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存 为映射表;
将所述映射表保存在事件总线中;
将第一事件发送至事件总线;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的 消费者;
将第一事件发送至所匹配到的消费者。
本发明提供的C++事件总线实现方法具有很高的灵活性、易用性,具体表现 如下:
1.不限制事件的类型;
2.支持生产者产生的事件的数量和类型在运行时和消费者进行匹配;
3.支持运行时检测。
附图说明
图1为本发明实施例提供的C++事件总线实现方法的流程图。
图2为本发明实施例提供的C++事件总线实现方法的一个具体应用案例的C++代码运行结果截图。
具体实施方式
以下结合附图及具体实施例对本发明作进一步说明。
参照图1。本实施例提供的C++事件总线实现方法,包括以下步骤:
a.创建获取消费者所能处理事件的类型的模板结构体;
b.通过所述模板结构体获取消费者所能处理的事件的类型;
c.建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保 存为映射表;
d.将所述映射表保存在事件总线中;
e.将第一事件发送至事件总线;
f.根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型 的消费者;
g.将所述第一事件发送至所匹配到的消费者。
以下对本实施例提供的C++事件总线实现方的各个步骤作详细说明。
所述a.创建获取消费者所能处理事件的类型的模板结构体的具体方法为:
a1.先声明一个基本的第一模板结构体;
a2.再声明与消费者所能处理的事件的类型相匹配的第二模板结构体。
因为要实现生产者产生的事件的类型在运行时和消费者进行匹配,因此必 须能够在运行时获取到消费者所能处理的事件的类型的信息。在其他语言里面 可以通过反射的机制进行获取,但C++没有反射的机制,本实施例中通过模板结 构体的方法实现类似反射的机制。
b.通过所述模板结构体获取消费者所能处理的事件的类型的具体方法为:
b1.通过所述第一模板结构体以及所述第二模板结构体获取消费者所能处 理事件的类型。
以消费者所能处理的事件的参数的数量为N的C++的代码举例如下:
上述代码说明如下:
Ret表示消费者的返回类型;
Param1,Param2,….ParamN表示消费者的参数;
typedef Ret(*FuncPointer)(Param1,Param2,…,ParamN)表示事件的 类型;
通过FunctionTraits<T>获取消费者所能处理事件的类型时,编译器会自动 寻找一个符合该消费者所能处理的事件的参数的数量的模板结构体进行实例化, 因此调用FunctionTraits<T>::FuncPointer之后即可获取消费者所能处理的事 件的类型。
c.建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保 存为映射表;
d.将所述映射表保存在事件总线中;
根据所获取到的消费者所能处理的事件的类型,通过typeid函数将消费者 所能处理的事件的类型提取为运行时可使用的信息;
typeid(FunctionTraits<T>::FuncPointer)。
根据typeid函数提取的信息,建立消费者及其所能处理的事件的类型的映 射关系,并将该映射关系保存在事件总线类型为std::map<type_index,void*> 的映射表中:
subscriberMap[typeid(FunctionTraits<T>::FuncPointer)]
=FunctionTraits<T>::FuncPointer(t);
e.将第一事件发送至事件总线;
f.根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型 的消费者;
g.将所述第一事件发送至所匹配到的消费者。
事件总线通过使用typedef的方法,将生产者产生的事件的类型组合起来 后,通过typeid获取该事件类型的运行时参数,然后在映射表里面,匹配对应 的消费者。
本实施例提供的C++事件总线实现方法具有很高的灵活性、易用性,具体表 现如下:
1.不限制事件的类型;
2.支持生产者产生的事件的数量和类型在运行时和消费者进行匹配;
3.支持运行时检测。
此外,对于本实施例提供的C++事件总线实现方法中,各步骤的执行单位作 如下说明:
创建获取消费者所能处理事件的类型的模板结构体;该步骤由事件总线编 写人员编写;
通过所述模板结构体获取消费者所能处理的事件的类型;该步骤由事件总 线执行;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存 为映射表;该步骤由事件总线执行;
将所述映射表保存在事件总线中;该步骤由事件总线执行;
将第一事件发送至事件总线;该步骤由事件生产者执行;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的 消费者;该步骤由事件总线执行;
将第一事件发送至所匹配到的消费者;该步骤由事件总线执行。
由上,可知:
先声明一个基本的第一模板结构体;再声明与消费者所能处理的事件的类 型相匹配的第二模板结构体;该两个步骤由事件总线编写人员编写。
通过所述第一模板结构体以及所述第二模板结构体获取消费者所能处理事 件的类型;该步骤由事件总线执行。
根据所获取到的消费者所能处理的事件的类型,通过typeid函数将消费者 所能处理的事件的类型提取为运行时可使用的信息;根据typeid函数提取的信 息,建立消费者及其所能处理的事件的类型的映射关系,并将该映射关系保存 在事件总线类型的映射表中;该两个步骤由事件总线执行。
采用本实施例提供的C++事件总线实现方法的一个具体应用案例的C++代码 如下:
本实施例提供的C++事件总线实现方法的一个具体应用案例的C++代码运行 结果截图如图2所示。
以上为本发明举例说明。
Claims (3)
1.C++事件总线实现方法,其特征在于,包括以下步骤:
创建获取消费者所能处理事件的类型的模板结构体;
通过所述模板结构体获取消费者所能处理的事件的类型;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表;
将所述映射表保存在事件总线中;
将第一事件发送至事件总线;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的消费者;
将所述第一事件发送至所匹配到的消费者。
2.如权利要求1所述的C++事件总线实现方法,其特征在于,所述创建获取消费者所能处理事件的类型的模板结构体;通过所述模板结构体获取消费者所能处理的事件的类型的具体方法为:
先声明一个基本的第一模板结构体;
再声明与消费者所能处理的事件的类型相匹配的第二模板结构体;
通过所述第一模板结构体以及所述第二模板结构体获取消费者所能处理事件的类型。
3.如权利要求1所述的C++事件总线实现方法,其特征在于,所述建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存为映射表的具体方法为:
根据所获取到的消费者所能处理的事件的类型,通过typeid函数将消费者所能处理的事件的类型提取为运行时可使用的信息;
根据typeid函数提取的信息,建立消费者及其所能处理的事件的类型的映射关系,并将所述映射关系保存在事件总线类型的映射表中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810689005.8A CN108958717B (zh) | 2018-06-28 | 2018-06-28 | C++事件总线实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810689005.8A CN108958717B (zh) | 2018-06-28 | 2018-06-28 | C++事件总线实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108958717A true CN108958717A (zh) | 2018-12-07 |
CN108958717B CN108958717B (zh) | 2023-02-28 |
Family
ID=64487653
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810689005.8A Active CN108958717B (zh) | 2018-06-28 | 2018-06-28 | C++事件总线实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108958717B (zh) |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070005410A1 (en) * | 2005-06-30 | 2007-01-04 | Ebay Inc. | Business event processing |
CN103186493A (zh) * | 2011-12-27 | 2013-07-03 | 金蝶软件(中国)有限公司 | 一种事件处理方法及相关设备、系统 |
CN103891249A (zh) * | 2011-08-18 | 2014-06-25 | 瑞典爱立信有限公司 | 用于确定事件实例的方法和设备 |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN105573756A (zh) * | 2015-12-15 | 2016-05-11 | 金蝶软件(中国)有限公司 | 一种脚本语言扩展方法及事件总线架构 |
CN106095668A (zh) * | 2016-06-02 | 2016-11-09 | 上海科梁信息工程股份有限公司 | 基于事件和动作的c++测试用例的生成方法 |
CN106250246A (zh) * | 2016-07-25 | 2016-12-21 | 福建天泉教育科技有限公司 | 一种事件传递的方法及系统 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN106445546A (zh) * | 2016-10-10 | 2017-02-22 | 腾讯科技(深圳)有限公司 | 一种事件系统的创建方法及装置 |
US20170068578A1 (en) * | 2015-09-04 | 2017-03-09 | Successfactors, Inc. | Uniform Event Framework |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
CN107038076A (zh) * | 2016-10-25 | 2017-08-11 | 努比亚技术有限公司 | 组件系统及组件交互方法 |
-
2018
- 2018-06-28 CN CN201810689005.8A patent/CN108958717B/zh active Active
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20070005410A1 (en) * | 2005-06-30 | 2007-01-04 | Ebay Inc. | Business event processing |
CN103891249A (zh) * | 2011-08-18 | 2014-06-25 | 瑞典爱立信有限公司 | 用于确定事件实例的方法和设备 |
CN103186493A (zh) * | 2011-12-27 | 2013-07-03 | 金蝶软件(中国)有限公司 | 一种事件处理方法及相关设备、系统 |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
US20170068578A1 (en) * | 2015-09-04 | 2017-03-09 | Successfactors, Inc. | Uniform Event Framework |
CN105573756A (zh) * | 2015-12-15 | 2016-05-11 | 金蝶软件(中国)有限公司 | 一种脚本语言扩展方法及事件总线架构 |
CN106095668A (zh) * | 2016-06-02 | 2016-11-09 | 上海科梁信息工程股份有限公司 | 基于事件和动作的c++测试用例的生成方法 |
CN106250246A (zh) * | 2016-07-25 | 2016-12-21 | 福建天泉教育科技有限公司 | 一种事件传递的方法及系统 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN106445546A (zh) * | 2016-10-10 | 2017-02-22 | 腾讯科技(深圳)有限公司 | 一种事件系统的创建方法及装置 |
CN107038076A (zh) * | 2016-10-25 | 2017-08-11 | 努比亚技术有限公司 | 组件系统及组件交互方法 |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
Non-Patent Citations (2)
Title |
---|
W. WANGDEE 等: "Utilization of time varying event-based customer interruption cost load shedding schemes" * |
许稳堂 等: "基于Mule的IEC61968信息交互总线的研究与应用" * |
Also Published As
Publication number | Publication date |
---|---|
CN108958717B (zh) | 2023-02-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
EP3971706B1 (en) | Method, apparatus and electronic device for deploying operator in deep learning frame work | |
CN100389391C (zh) | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 | |
US8490050B2 (en) | Automatic generation of user interfaces | |
CN110096338A (zh) | 智能合约执行方法、装置、设备及介质 | |
CN106415495B (zh) | 用于应用开发的编程系统和语言 | |
CN102859489B (zh) | 可恢复的方法 | |
CN104932905A (zh) | 一种aadl到c语言的代码自动生成方法 | |
CN102073525A (zh) | 基于Java平台的Web业务系统的动态升级方法及装置 | |
KR20130137652A (ko) | 확장 가능한 데이터 병렬 시맨틱스 | |
JP2005301994A (ja) | 優先バインディング | |
Riliskis et al. | Ravel: Programming iot applications as distributed models, views, and controllers | |
CN109460220A (zh) | 报文预定义代码生成方法、装置、电子设备和存储介质 | |
CN110471698A (zh) | Api文档的生成方法与装置、存储介质及计算机设备 | |
WO2012067803A2 (en) | Map transformation in data parallel code | |
CN101692206A (zh) | 一种为静态回调函数添加动态参数的方法及相关实现 | |
US9158516B2 (en) | Dual mode evaluation for programs containing recursive computation | |
CN101714075B (zh) | 函数调用方法和装置 | |
CN108958717A (zh) | C++事件总线实现方法 | |
CN102750177A (zh) | 一种使用编译器的脚本实现方法 | |
CN102664952A (zh) | 一种对嵌入式设备集群管理及监控的方法 | |
CN101794240A (zh) | 一种聚合数据内容的方法和系统 | |
Ostermann et al. | Independent Extensibility–an open challenge for AspectJ and Hyper/J | |
CN103473116A (zh) | 一种大数据量数据远程调用方法及装置 | |
Al-Jaroodi et al. | A comparative study of parallel and distributed Java projects for heterogeneous systems | |
CN106201493A (zh) | 基于vxWorks的ucGui系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |