CN108958717B - C++事件总线实现方法 - Google Patents
C++事件总线实现方法 Download PDFInfo
- Publication number
- CN108958717B CN108958717B CN201810689005.8A CN201810689005A CN108958717B CN 108958717 B CN108958717 B CN 108958717B CN 201810689005 A CN201810689005 A CN 201810689005A CN 108958717 B CN108958717 B CN 108958717B
- Authority
- CN
- China
- Prior art keywords
- event
- consumer
- processed
- event bus
- type
- 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.)
- Active
Links
Images
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 (1)
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 CN108958717A (zh) | 2018-12-07 |
CN108958717B true 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 (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103186493A (zh) * | 2011-12-27 | 2013-07-03 | 金蝶软件(中国)有限公司 | 一种事件处理方法及相关设备、系统 |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN105573756A (zh) * | 2015-12-15 | 2016-05-11 | 金蝶软件(中国)有限公司 | 一种脚本语言扩展方法及事件总线架构 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN106250246A (zh) * | 2016-07-25 | 2016-12-21 | 福建天泉教育科技有限公司 | 一种事件传递的方法及系统 |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
CN107038076A (zh) * | 2016-10-25 | 2017-08-11 | 努比亚技术有限公司 | 组件系统及组件交互方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7779421B2 (en) * | 2005-06-30 | 2010-08-17 | Ebay Inc. | Business event processing |
CN103891249B (zh) * | 2011-08-18 | 2017-12-12 | 瑞典爱立信有限公司 | 用于确定事件实例的方法和设备 |
US10552235B2 (en) * | 2015-09-04 | 2020-02-04 | Successfactors, Inc. | Uniform event framework |
CN106095668B (zh) * | 2016-06-02 | 2018-12-11 | 上海科梁信息工程股份有限公司 | 基于事件和动作的c++测试用例的生成方法 |
CN106445546B (zh) * | 2016-10-10 | 2019-08-27 | 腾讯科技(深圳)有限公司 | 一种事件系统的创建方法及装置 |
-
2018
- 2018-06-28 CN CN201810689005.8A patent/CN108958717B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103186493A (zh) * | 2011-12-27 | 2013-07-03 | 金蝶软件(中国)有限公司 | 一种事件处理方法及相关设备、系统 |
CN104360904A (zh) * | 2014-10-16 | 2015-02-18 | 四川长虹电器股份有限公司 | 基于事件总线的模块间消息传递机制 |
CN105573756A (zh) * | 2015-12-15 | 2016-05-11 | 金蝶软件(中国)有限公司 | 一种脚本语言扩展方法及事件总线架构 |
CN106250246A (zh) * | 2016-07-25 | 2016-12-21 | 福建天泉教育科技有限公司 | 一种事件传递的方法及系统 |
CN106250229A (zh) * | 2016-08-16 | 2016-12-21 | 东软集团股份有限公司 | 事件处理的方法及装置 |
CN107038076A (zh) * | 2016-10-25 | 2017-08-11 | 努比亚技术有限公司 | 组件系统及组件交互方法 |
CN106598751A (zh) * | 2016-10-31 | 2017-04-26 | 武汉斗鱼网络科技有限公司 | 通过事件总线分发事件的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108958717A (zh) | 2018-12-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105117233B (zh) | Api调用方法及装置 | |
CN107147620B (zh) | 一种消息交互处理方法、客户端和服务端 | |
TWI256587B (en) | Firmware upgrading method and system executing same | |
CN101699405A (zh) | 一种宿主程序和插件及插件间进行交互的方法及装置 | |
CN102831022B (zh) | 修改系统配置的方法和装置 | |
CN117251249A (zh) | 一种基于多虚拟机区块链平台跨虚拟机调用方法 | |
ATE326719T1 (de) | Adapter, speichereinrichtung für umgesetzte daten und verfahren zum betrieb einer speichereinrichtung für umgesetzte daten | |
CN201497985U (zh) | 嵌入式设备辅助故障分析工具 | |
EP3860043A3 (en) | Method and apparatus for implementing smart contract based on blockchain | |
WO2018018607A1 (zh) | 一种基于报文协议识别的传输协议固定转换方法及装置 | |
CN108958717B (zh) | C++事件总线实现方法 | |
CN110035167A (zh) | 录音方法及相关装置 | |
CN112379886A (zh) | 数据格式转换系统及其方法 | |
CN110704528A (zh) | 可自动识别与配置转换的数据处理方法 | |
CN104714806B (zh) | 基于人机界面系统的脚本处理方法及装置 | |
CN116300780B (zh) | 零部件配置方法、装置、电子设备及存储介质 | |
CN109582318A (zh) | Portobuf本地化的处理方法、装置、终端及存储介质 | |
CN103914304B (zh) | 一种基于sap平台的不同结构类型参数转换方法 | |
CN105404557A (zh) | 基于消息队列的进程通信方法 | |
CN113342431B (zh) | 函数调用栈回溯、程序异常处理方法、装置、设备及介质 | |
CN114217932A (zh) | 第三方对接异常处理方法及系统 | |
CN110098960B (zh) | 一种分布式块存储系统免密自动化配置方法及装置 | |
CN108107872B (zh) | 一种基于网络的dsp应用在线调试系统及调试方法 | |
CN103294589B (zh) | 一种测试用例的实现方法、系统及中间适配装置 | |
CN105446774B (zh) | 一种插件处理方法及用户终端 |
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 |