CN108958717A - C++事件总线实现方法 - Google Patents

C++事件总线实现方法 Download PDF

Info

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
Application number
CN201810689005.8A
Other languages
English (en)
Other versions
CN108958717B (zh
Inventor
袁德信
陈亮
黄嵩
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Digital Kinetic Energy Information Technology Co Ltd
Original Assignee
Shenzhen Digital Kinetic Energy Information Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shenzhen Digital Kinetic Energy Information Technology Co Ltd filed Critical Shenzhen Digital Kinetic Energy Information Technology Co Ltd
Priority to CN201810689005.8A priority Critical patent/CN108958717B/zh
Publication of CN108958717A publication Critical patent/CN108958717A/zh
Application granted granted Critical
Publication of CN108958717B publication Critical patent/CN108958717B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms
    • G06F8/315Object-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++事件总线实现方法,包括以下步骤:
创建获取消费者所能处理事件的类型的模板结构体;
通过所述模板结构体获取消费者所能处理的事件的类型;
建立消费者及其所能处理的事件的类型的映射关系,将所述映射关系保存 为映射表;
将所述映射表保存在事件总线中;
将第一事件发送至事件总线;
根据所述第一事件的类型在映射表中匹配能处理的所述第一事件的类型的 消费者;
将第一事件发送至所匹配到的消费者。
本发明提供的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函数提取的信息,建立消费者及其所能处理的事件的类型的映射关系,并将所述映射关系保存在事件总线类型的映射表中。
CN201810689005.8A 2018-06-28 2018-06-28 C++事件总线实现方法 Active CN108958717B (zh)

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)

* Cited by examiner, † Cited by third party
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 努比亚技术有限公司 组件系统及组件交互方法

Patent Citations (12)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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