CN106445546B - 一种事件系统的创建方法及装置 - Google Patents

一种事件系统的创建方法及装置 Download PDF

Info

Publication number
CN106445546B
CN106445546B CN201610886180.7A CN201610886180A CN106445546B CN 106445546 B CN106445546 B CN 106445546B CN 201610886180 A CN201610886180 A CN 201610886180A CN 106445546 B CN106445546 B CN 106445546B
Authority
CN
China
Prior art keywords
event
objective function
function object
function
processed
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
Application number
CN201610886180.7A
Other languages
English (en)
Other versions
CN106445546A (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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen 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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201610886180.7A priority Critical patent/CN106445546B/zh
Publication of CN106445546A publication Critical patent/CN106445546A/zh
Application granted granted Critical
Publication of CN106445546B publication Critical patent/CN106445546B/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/20Software design
    • G06F8/24Object-oriented

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明实施例公开了一种事件系统的创建方法及装置,用于解决现有非静态成员函数与基类耦合时给代码设计带来限制的问题。本发明实施例方法包括:获取待处理函数,其中,所述待处理函数包括静态成员函数;将所述待处理函数生成目标函数对象;获取所述目标函数对象对应的事件名称;根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。

Description

一种事件系统的创建方法及装置
技术领域
本发明涉及计算机领域,具体涉及一种事件系统的创建方法及装置。
背景技术
在C++程序设计中,其总体设计原则是模块化,将C++程序划分为若干个模块,每个模块完成特定的功能,其中,事件机制可以有效解决模块间的解耦问题,“继承”、“关联(Association)”、“事件”对应的耦合度依次降低。事件系统就是创建一个事件映射表,该事件映射表包括一个事件名对应一个或者多个处理函数的映射关系,其中,若处理函数是全局函数或者静态成员函数,则用指针存储全局函数或者静态成员函数,若处理函数是非静态成员函数,通常需要给非静态成员函数安插一个基类,例如:基类为EventCallback,在基类中声明非静态成员函数的指针类型。
但是,当给非静态成员函数安插一个基类时,则非静态成员函数必须继承自基类,与基类耦合,从而造成一个不友好的桎梏,若仅为响应事件将非静态成员函数与基类强耦合在一起,违背了设计原则,且给代码设计带来限制。
发明内容
本发明实施例提供了一种事件系统的创建方法及装置,用于解决现有非静态成员函数与基类耦合时给代码设计带来限制的问题,不需要将非静态成员函数强制继承自基类,不影响代码的设计。
本发明第一方面提供一种事件系统的创建方法,包括:
获取待处理函数,其中,所述待处理函数包括静态成员函数;
将所述待处理函数生成目标函数对象;
获取所述目标函数对象对应的事件名称;
根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
本发明第二方面提供一种事件系统的创建装置,包括:
获取模块,用于获取待处理函数,其中,所述待处理函数包括非静态成员函数;
生成模块,用于将所述获取模块获取的所述待处理函数生成目标函数对象;
所述获取模块,还用于获取所述生成模块生成的所述目标函数对象对应的事件名称;
创建模块,用于根据所述生成模块生成的所述目标函数对象和所述获取模块获取的所述目标函数对象对应的所述事件名称创建事件系统。
从以上技术方案可以看出,本发明实施例具有以下优点:
首先获取待处理函数,其中,该待处理函数包括非静态成员函数,此时,无需给非静态成员函数安插一个基类,而是将待处理函数生成目标函数对象,通过目标函数对象和目标函数对象对应的事件名称创建事件系统,减少模块之间的耦合,不影响代码的设计。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例中事件系统的创建装置的一个结构示意图;
图2为本发明实施例中事件系统的创建方法的一个实施例示意图;
图3为本发明实施例中事件系统的创建方法的另一个实施例示意图;
图4为本发明实施例中事件系统的创建方法的另一个实施例示意图;
图5为本发明实施例中事件系统的创建方法的另一个实施例示意图;
图6为本发明实施例中事件系统的创建方法的代码片段示意图;
图7为本发明实施例中事件系统的创建装置的另一个结构示意图;
图8为本发明实施例中事件系统的创建装置的另一个结构示意图;
图9为本发明实施例中事件系统的创建装置的另一个结构示意图;
图10为本发明实施例中事件系统的创建装置的另一个结构示意图。
具体实施方式
本发明实施例提供了一种事件系统的生成方法及装置,用于解决现有非静态成员函数与基类耦合时给代码设计带来限制的问题,不需要将非静态成员函数强制继承自基类,不影响代码的设计。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在介绍本发明实施例之前,先介绍一下本发明实施例中的事件系统,该事件系统包括目标函数对象和目标函数对象对应的事件名称的映射列表,其中,该目标函数对象为对处理函数(非静态成员函数,静态成员函数,全局函数等)包装成的function函数对象,其实,由于将处理函数包装在function函数的内部,则不需要知道处理函数属于哪个类,也就是不需要依赖这个类,相互之间独立,消除了处理函数与基类的耦合,使之不影响对既有C++程序代码的设计。该事件系统的使用非常简单,可以很方便地应用到既有的C++程序设计中,不需要对现有类的继承树进行修改,只要将成员函数或者全局函数定义为voideventHandler(any param)形式,成员函数可以是非静态成员函数或者静态成员函数,若是非静态成员函数,由于非静态成员函数有一个指向当前对象的指针this,则事件系统还可以维护该非静态成员函数的指针this的对象生命期。
本发明的技术方案可用于任何C++程序设计中,其中,该C++程序设计出的应用可以是任何用于安装在终端上的应用,例如:学习应用,游戏应用,生活应用等,此处不做具体限定,本发明的技术方案所创建的事件系统能够减少模块之间的耦合,减少代码的复杂度。触发事件的模块只需要触发出相应的待处理事件,触发事件的模块不必清楚处理事件的模块,处理事件的模块只需要根据自己的需求处理自己感兴趣的待处理事件,如果待处理事件中带有参数,事件系统的创建装置检测该参数是否符合预设的目标参数类型,若是,则调用处理函数处理该待处理事件,若否,则不能抛出异常事故信息,让该待处理事件继续往下传递,然后交给后续的处理函数进行处理。可见,如果没有事件系统,则需要将待处理事件的代码都塞到事件触发的模块,使得代码局部规模变得庞大而不便于维护。
本发明的技术方案中,使用标准库中的function函数将成员函数和全局函数包装成一个function函数对象,则不需要通过安插一个基类从而硬性继承耦合。对于非静态成员函数,事件系统可维护非静态成员函数的this对象的生命期,简化了内存管理,非静态成员函数的调用开销与虚函数一致,以any作为事件处理函数的参数,可以包容任何类型的待处理事件,且类型安全。
请参阅图1,对本发明涉及的事件系统的创建装置100的具体结构进行介绍,该事件系统的创建装置可看作是应用通信系统中的服务器,所述应用通信系统还包括终端等,此处不做具体限定该事件系统的创建装置100包括:收发器110、存储器120、处理器130等部件。本领域技术人员可以理解,图1中示出的该事件系统的创建装置100的结构并不构成对第一服务器的限定,可以包括比图1更多或更少的部件,或者组合某些部件,或者不同的部件布置。
收发器110可用于收发信息,例如:信号的接收和发送。收发器110通过无线通信与终端等其他设备通信,无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(英文全称:Global System of Mobile communication,缩写:GSM)、通用分组无线服务(英文全称:General Packet Radio Service,缩写:GPRS)、码分多址(英文全称:CodeDivision Multiple Access,缩写:CDMA)、宽带码分多址(英文全称:Wideband CodeDivision Multiple Access,缩写:WCDMA)、长期演进(英文全称:Long Term Evolution,缩写:LTE)、电子邮件、短消息服务(英文全称:Short Messaging Service,缩写:SMS)等。
存储器120可用于存储软件程序以及模块,处理器130通过运行存储在存储器120的软件程序以及模块,从而执行该事件系统的创建装置100的各种功能应用以及数据处理。
其中,处理器130用于执行如下步骤:
获取待处理函数,其中,所述待处理函数包括非静态成员函数;
将所述待处理函数生成目标函数对象;
获取所述目标函数对象对应的事件名称;
根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
在一些可能的实现方式中,处理器130根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统包括:
根据所述目标函数对象和所述目标函数对象对应的所述事件名称形成映射列表,并根据所述映射列表创建所述事件系统。
在一些可能的实现方式中,处理器130根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之后,将所述事件系统通过map表或者hash表存储。
在一些可能的实现方式中,处理器130根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之前,确定所述目标函数对象的目标参数类型;
处理器130将所述事件系统通过map表或者hash表存储之后,获取待处理事件;若所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
在一些可能的实现方式中,处理器130确定所述目标函数对象的目标参数类型包括:
从源代码boost库中的参数类型中确定所述目标函数对象的目标参数类型;
或者,从智能指针创建出的参数类型中确定所述目标函数对象的目标参数类型;
或者,从C++内置的参数类型中确定所述目标函数对象的目标参数类型。
在一些可能的实现方式中,处理器130确定所述目标函数对象的目标参数类型之后,获取所述目标参数类型的变量;
通过所述目标参数类型的变量维护所述目标函数对象的生命期。
在一些可能的实现方式中,处理器130通过所述目标参数类型的变量维护所述目标函数对象的生命期包括:
若处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从第一值增加至第二值;
若结束处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从所述第二值降低至所述第一值。
请参阅图2,为本发明实施例中事件系统的创建方法的一个实施例示意图,该实施例的具体流程如下:
步骤201、获取待处理函数,其中,所述待处理函数包括非静态成员函数。
本发明实施例中,待处理函数至少包括非静态成员函数,该待处理函数还可以包括静态成员函数或者全局函数,在实际应用中,为了兼容C++程序设计中的所有模块,该待处理函数包括非静态成员函数,静态成员函数和全局函数。
其中,函数本质上是全局的,因为一个函数要被另外的函数调用,但是,也可以指定函数只能被本文件调用,而不能被其他文件调用,根据函数能否被其他文件调用,将函数区分为静态成员函数和非静态成员函数。如果一个函数只能被本文件中其他函数所调用,它称为静态成员函数。使用静态成员函数,可以使函数只局限于所在文件。通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们前面都冠以static使之局部化,其他文件不能引用。在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是非静态成员函数,可供其他文件调用。在需要调用此函数的文件中,用extern声明所用的函数时非静态成员函数。
步骤202、将所述待处理函数生成目标函数对象。
与现有技术不同的是,将待处理函数生成目标函数对象,若该待处理函数是非静态成员函数,则无需对该非静态成员函数安插一个基类,而是将非静态函数生成目标函数对象,其中,该目标函数对象可以是使用标准库中的function函数将非静态成员函数包装成一个function函数对象,则不需要通过安插一个基类从而硬性继承耦合。
步骤203、获取所述目标函数对象对应的事件名称。
在实际应用中,由于是将待处理函数生成目标函数对象的,则根据待处理函数对应的事件名称作为该目标函数对象对应的事件名称。
步骤204、根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
本发明实施例中,根据目标函数对象和目标函数对象对应的事件名称创建事件系统,即一个目标函数对象对应一个事件名称,然后统计多个目标函数对象对应多个事件名称,从而创建该事件系统,则不需要再将事件的代码都塞到事件触发的模块,从而便于维护代码的局部规模。
在图2所示实施例的基础上,请参阅图3,为本发明实施例中事件系统的创建方法的另一个实施例示意图,该实施例的具体流程如下:
步骤301、获取待处理函数,其中,所述待处理函数包括非静态成员函数。
步骤302、将所述待处理函数生成目标函数对象。
步骤303、获取所述目标函数对象对应的事件名称。
需要说明的是,步骤301至步骤303与图2所示的步骤201至步骤203相同或者相似,具体可参阅步骤201至步骤203的描述,此处不再赘述。
步骤304、根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
本发明实施例中,根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统的方式有很多种,在一些可能的实现方式中,所述根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统包括:根据所述目标函数对象和所述目标函数对象对应的所述事件名称形成映射列表,并根据所述映射列表创建所述事件系统。
可见,先将目标函数对象和目标函数对象对应的事件名称形成映射列表后,再根据该映射列表创建事件系统,从而便于后续直接从事件系统中查找目标函数对象,以及目标函数对象对应的事件名称。
步骤305、将所述事件系统通过map表或者hash表存储。
本发明实施例中,若事件量比较小,则事件系统使用map存储,若事件量比较大,则使用hash存储,例如:boost库的order_map,可见,根据事件量的大小合理的选取存储方式,具体可根据实际情况而定,此处不做具体限定。
在图3所示实施例的基础上,请参阅图4,为本发明实施例中事件系统的创建方法的另一个实施例示意图,该实施例的具体流程如下:
步骤401、获取待处理函数,其中,所述待处理函数包括非静态成员函数。
步骤402、将所述待处理函数生成目标函数对象。
步骤403、获取所述目标函数对象对应的事件名称。
需要说明的是,步骤401至步骤403与图2所示的步骤201至步骤203相同或者相似,具体可参阅步骤201至步骤203的描述,此处不再赘述。
步骤404、确定所述目标函数对象的目标参数类型。
本发明实施例中,任何参数类型都可以作为目标函数对象的参数类型,但是,在实际应用中,只需要将符合目标参数类型的待处理事件进行处理,因此,需要确定目标函数对象的目标参数类型,其中,确定目标函数对象的目标参数类型的方式有很多种,在一些可能的实现方式中,所述确定所述目标函数对象的目标参数类型包括:从源代码boost库中的参数类型中确定所述目标函数对象的目标参数类型;或者,从智能指针创建出的参数类型中确定所述目标函数对象的目标参数类型;或者,从C++内置的参数类型中确定所述目标函数对象的目标参数类型。
在实际应用中,目标函数对象的参数类型可以是boost::any类型,可以接纳任何类型的参数,大大增加了参数类型的通用性,还可以用各种C++内置的基本类型,还可以用目标函数对象的智能指针来创建出来的复杂参数类型。则从目标函数对象的参数类型中随机或者按照某种预设规则确定该目标参数类型,此处不做具体限定。
步骤405、根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
步骤406、将所述事件系统通过map表或者hash表存储。
需要说明的是,步骤405和步骤406与图3所述的步骤304和步骤305相同或者相似,具体可参阅步骤304和步骤305的描述,此处不做具体限定。
步骤407、获取待处理事件。
本发明实施例中,需要获取待处理事件,然后通过事件系统判断是否响应该待处理事件。
步骤408、若所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
在实际应用中,每个待处理事件都有包括的参数类型,若该待处理事件的参数类型符合该目标参数类型,则调用该目标函数对象处理该待处理事件,否则,将该待处理事件交给后续的目标函数对象进行处理。
在图4所示实施例的基础上,请参阅图5,为本发明实施例中事件系统的创建方法的另一个实施例示意图,该实施例的具体流程如下:
步骤501、获取待处理函数,其中,所述待处理函数包括非静态成员函数。
步骤502、将所述待处理函数生成目标函数对象。
步骤503、获取所述目标函数对象对应的事件名称。
步骤504、确定所述目标函数对象的目标参数类型。
步骤505、根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
步骤506、将所述事件系统通过map表或者hash表存储。
步骤507、获取待处理事件。
步骤508、若所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
需要说明的是,步骤501至步骤508与图4所示的步骤401至步骤408相同或者相似,具体可参阅步骤401至步骤408的描述,此处不再赘述。
步骤509、获取所述目标参数类型的变量。
步骤510、通过所述目标参数类型的变量维护所述目标函数对象的生命期。
本发明实施例中,通过所述目标参数类型的变量维护所述目标函数对象的生命期的方式有很多种,在一些可能的实现方式中,所述通过所述目标参数类型的变量维护所述目标函数对象的生命期包括:若处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从第一值增加至第二值;若结束处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从所述第二值降低至所述第一值。因此,通过维护目标函数对象的生命期,保障当目标函数对象处于事件系统中时,目标函数对象不被析构,即不被脱离作用域。
可见,使用标准库中的function函数将待处理函数包装成一个目标函数对象,而不需要知道该待处理函数定义在哪个类中,消除了待处理函数与基类的耦合,使之不影响对既有C++程序代码的设计。其中,非静态成员函数带有一个this指针,将非静态成员函数包装成function函数对象后,若this指针指涉的对象被析构后,function函数对象执行会导致程序崩溃,可用智能指针(share_ptr)与function函数对象合作,共同维护this指针的生命期。
另外,待处理函数的参数能接纳所有的类型,其中,C++不同于C#、java,所有的参数类型都有一个共同的基类Object,而C++中没有这种共同的基类,因此,选用boost::any作为待处理函数的参数类型,可以包罗各种参数类型。还有,不需要强制继承自Eventlistener基类,就可以方便地使用事件系统来响应事件。
在实际应用中,如图6所示,为建模语言(英文全称:Unified Modeling Language,缩写:UML)的一个使用范例图,其中,EvnetSlot直译为事件槽。如果“事件系统”是一张表的话,表中的每一项就是一个EventSlot,EvnetSlot中的_funAddress是function的地址,用于当删除待处理函数时,查找function用。_call是一个function函数对象,待处理函数是包装在这个变量中的。EventSlot(call:function<void(any)>&,funAddress:void*)是一个构造函数,创建一个EventSlot对象时,会调用此函数。
EventService是事件系统类,它里面有一个m_dispatchTable变量,其实,它是一张表,这张表里面存放了很多个项数据。每一项数据有两个成员,一个是string(事件名称),一个是list<EventSlot*>(是事件槽列表),一个事件被触发时,可以执行多个处理函数,其中,一个事件槽包装了一个事件处理函数。Dispatch(name:string,arg:any&)是触发一个事件(name),事件的参数是arg在事件系统的内部会调用与该事件关联的事件处理函数(list<EventSlot*>,参考EventService中的m_dispatchTable),Remove(name:string,fun:Func),删除一个事件的待处理函数,当一个待处理函数被删除后,事件触发时,该函数不会被执行。
TestClass是一个测试的类,它有一个成员函数(DoSomthing(param:any&)),用于充当待处理函数,TestClass*p=new TestClass()表示创建一个TestClass对象,然后赋值给指针变量p,shared_ptr<TestClass>ptr(p)表示定义一个智能指针对象,将指针变量p赋值给它。EventService*d=new EventService()表示创建一个事件系统对象,然后赋值给指针变量d。d->register("EVENT_TEST",&TestClass::DoSomething,ptr)表示注册一个名为EVENT_TEST的事件,待处理函数是TestClass::DoSomething,类对象的指针用shared_ptr包装成变量ptr。d->Dispatch("EVENT_TEST")表示触发事件EVENT_TEST,事件系统内部会调用ptr->DoSomething()函数,d->Remove("EVENT_TEST",&TestClass::DoSomething)表示删除EVENT_TEST事件的待处理函数TestClass::DoSomething。
当我们调用Register函数将成员函数注册到事件系统中时,会将智能指针ptr与TestClass::Dosomething包装成一个function,赋值此EventSlot成员_call(function),function内部会有一个变量来存储ptr对象,智能指针有一个特性,就是将一个智能指针保存(也就是赋值)在另一个智能指针时,智能指针维护的对象的引用计数就会加1,只要对象的引用计数不为0,该对象就不会被删除。
假设TestClass::DoSomething被用作非静态成员函数,但是TestClass不需要被迫继承自一个基类,即被EventListerner类“侵入”(intrusive),TestClass与基类不存在“继承”这种强制耦合,只是需要按照格式声明非静态成员函数。这样有效简化了使用事件系统的步骤,最关键的是事件系统的相关类型不会“侵入”到既有类的C++程序设计中。
本发明的技术方案中,将成员函数,全局函数全部包装成一个function函数对象,作为待处理事件的处理函数。然后建立一张映射表,即一张事件名称与function函数对象的对应表,当一个事件发生后,查看该映射表,找到与此事件名称对应的function函数对象,然后执行该function函数对象。function函数对象的参数类型是boost::any类型,可以接纳任何类型的参数,大大增加了参数类型的通用性。还可以用使用各种C++内置的基本类型,还可以使用智能指针来创建出来的复杂参数类型,而不用担心function函数对象的生命期,由于任何类型的参数都是可以接纳的,使用十分方便。
在图6所示的UML图中的使用范例中,使用share_ptr来管理新创建出来的TestClass对象,一并将其注册到事件系统中,由事件系统来维护该对象的生命期。将p交由ptr管理,起始阶段,智能指针对p的引用计数为1,当将ptr与TestClass::DoSomething()注册到事件系统后,智能指针对p的引用计数为2,当不需要处理事件后,将TestClass::DoSomething从事件系统中移除,p对的引用计数降为1,但是,当程序执行到超出ptr对象的作用域之外时,p对象才真正被析构掉。因此,事件系统可用来管理非静态成员函数的this对象的生命期,保障当非静态成员函数处于事件系统中时,该this对象不被析构。
在实际应用中,也可以选择人工来维护this对象的生命期,其中,注册事件的函数提供了多个重载版本可供选择:
第一种是注册成员函数,人工维护this对象的生命期,具体函数如下:
template<typename Func,typename This>
void Register(const std::string&name,Func fun,This*pThis)。
第二种是注册成员函数,事件系统维护this对象的生命期,具体函数如下:
template<typename Func,typename This>
void Register(const std::string&name,Func fun,std::tr1::shared_ptr<This>pThis)。
第三种是注册全局函数,具体函数如下:
template<typename Func>
void Register(const std::string&name,Func fun)。
其中,第一种Register函数,是注册一个成员函数,第二种Regioster函数,也是注册一个成员函数,与第一个Register函数的区别在于它传入的是一个由智能指针(share_ptr)包装过的this指针,而第一个Register函数传入的是一个没有包装过的。如果用share_ptr包装过后,外面删掉该变量,不会影响事件系统。第三种Register函数,是注册全局函数。
事件系统使用boost库中的any类型作为事待处理函数的参数类型,它可以包容所有类型,在发送事件时,可以将任何类型参数(param)传到待处理函数,待处理函数可以检查param类型是不是与自己期待的类型,如果是就处理待处理事件,如果不是则忽略,如下函数代码:
为便于更好的实施本发明实施例的上述相关方法,下面还提供用于配合上述方法的相关装置。
请参阅图7,本发明实施例中事件系统的创建装置700的一个结构示意图,该事件系统的创建装置700包括获取模块701,生成模块702和创建模块703。
获取模块701,用于获取待处理函数,其中,所述待处理函数包括非静态成员函数;
生成模块702,用于将所述获取模块701获取的所述待处理函数生成目标函数对象;
所述获取模块701,还用于获取所述生成模块702生成的所述目标函数对象对应的事件名称;
创建模块703,用于根据所述生成模块702生成的所述目标函数对象和所述获取模块701获取的所述目标函数对象对应的所述事件名称创建事件系统。
在图7所示事件系统的的创建装置的基础上,请参阅图8,所述创建模块703具体用于根据所述目标函数对象和所述目标函数对象对应的所述事件名称形成映射列表,并根据所述映射列表创建所述事件系统。
所述事件系统的创建装置700还包括:
存储模块704,用于所述创建模块703根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之后,将所述事件系统通过map表或者hash表存储。
在图8所示事件系统的的创建装置的基础上,请参阅图9,所述事件系统的创建装置700还包括:
确定模块705,用于所述创建模块703根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之前,确定所述目标函数对象的目标参数类型;
在一些可能的实现方式中,所述确定模块705具体用于从源代码boost库中的参数类型中确定所述目标函数对象的目标参数类型;或者,从智能指针创建出的参数类型中确定所述目标函数对象的目标参数类型;或者,从C++内置的参数类型中确定所述目标函数对象的目标参数类型。
所述获取模块701,还用于所述存储模块704将所述事件系统通过map表或者hash表存储之后,获取待处理事件;
处理模块706,用于若所述获取模块701获取的所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
在图9所示事件系统的的创建装置的基础上,请参阅图10,所述事件系统的创建装置700还包括:
所述获取模块701,还用于所述确定模块705确定所述目标函数对象的目标参数类型之后,获取所述目标参数类型的变量;
维护模块707,用于通过所述目标参数类型的变量维护所述目标函数对象的生命期。
在一些可能的实现方式中,所述维护模块707具体用于若处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从第一值增加至第二值;若结束处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从所述第二值降低至所述第一值。
可见,获取模块701首先获取待处理函数,其中,该待处理函数包括非静态成员函数,此时,无需给非静态成员函数安插一个基类,而是生成模块702将待处理函数生成目标函数对象,创建模块703通过目标函数对象和目标函数对象对应的事件名称创建事件系统,减少模块之间的耦合,不影响代码的设计。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (14)

1.一种事件系统的创建方法,其特征在于,包括:
获取待处理函数,其中,所述待处理函数包括非静态成员函数;
将所述待处理函数生成目标函数对象;
获取所述目标函数对象对应的事件名称;
根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统。
2.根据权利要求1所述的创建方法,其特征在于,所述根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统包括:
根据所述目标函数对象和所述目标函数对象对应的所述事件名称形成映射列表,并根据所述映射列表创建所述事件系统。
3.根据权利要求1所述的创建方法,其特征在于,所述根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之后,所述方法还包括:
将所述事件系统通过map表或者hash表存储。
4.根据权利要求3所述的创建方法,其特征在于,所述根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之前,所述方法还包括:
确定所述目标函数对象的目标参数类型;
所述将所述事件系统通过map表或者hash表存储之后,所述方法还包括:
获取待处理事件;
若所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
5.根据权利要求4所述的创建方法,其特征在于,所述确定所述目标函数对象的目标参数类型包括:
从源代码boost库中的参数类型中确定所述目标函数对象的目标参数类型;
或者,从智能指针创建出的参数类型中确定所述目标函数对象的目标参数类型;
或者,从C++内置的参数类型中确定所述目标函数对象的目标参数类型。
6.根据权利要求4或5所述的创建方法,其特征在于,所述根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之后,所述方法还包括:
获取所述目标参数类型的变量;
通过所述目标参数类型的变量维护所述目标函数对象的生命期。
7.根据权利要求6所述的创建方法,其特征在于,所述通过所述目标参数类型的变量维护所述目标函数对象的生命期包括:
若处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从第一值增加至第二值;
若结束处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从所述第二值降低至所述第一值。
8.一种事件系统的创建装置,其特征在于,包括:
获取模块,用于获取待处理函数,其中,所述待处理函数包括非静态成员函数;
生成模块,用于将所述获取模块获取的所述待处理函数生成目标函数对象;
所述获取模块,还用于获取所述生成模块生成的所述目标函数对象对应的事件名称;
创建模块,用于根据所述生成模块生成的所述目标函数对象和所述获取模块获取的所述目标函数对象对应的所述事件名称创建事件系统。
9.根据权利要求8所述的创建装置,其特征在于,所述创建模块具体用于根据所述目标函数对象和所述目标函数对象对应的所述事件名称形成映射列表,并根据所述映射列表创建所述事件系统。
10.根据权利要求8所述的创建装置,其特征在于,所述事件系统的创建装置还包括:
存储模块,用于所述创建模块根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之后,将所述事件系统通过map表或者hash表存储。
11.根据权利要求10所述的创建装置,其特征在于,所述事件系统的创建装置还包括:
确定模块,用于所述创建模块根据所述目标函数对象和所述目标函数对象对应的所述事件名称创建事件系统之前,确定所述目标函数对象的目标参数类型;
所述获取模块,还用于所述存储模块将所述事件系统通过map表或者hash表存储之后,获取待处理事件;
处理模块,用于若所述获取模块获取的所述待处理事件所包括的参数类型符合所述目标参数类型,则调用所述目标函数对象处理所述待处理事件。
12.根据权利要求11所述的创建装置,其特征在于,所述确定模块具体用于从源代码boost库中的参数类型中确定所述目标函数对象的目标参数类型;或者,从智能指针创建出的参数类型中确定所述目标函数对象的目标参数类型;或者,从C++内置的参数类型中确定所述目标函数对象的目标参数类型。
13.根据权利要求11或12所述的创建装置,其特征在于,所述事件系统的创建装置还包括:
所述获取模块,还用于所述确定模块确定所述目标函数对象的目标参数类型之后,获取所述目标参数类型的变量;
维护模块,用于通过所述目标参数类型的变量维护所述目标函数对象的生命期。
14.根据权利要求13所述的创建装置,其特征在于,所述维护模块具体用于若处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从第一值增加至第二值;若结束处理所述待处理事件,则将所述目标参数类型的变量所对应的引用计数从所述第二值降低至所述第一值。
CN201610886180.7A 2016-10-10 2016-10-10 一种事件系统的创建方法及装置 Active CN106445546B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201610886180.7A CN106445546B (zh) 2016-10-10 2016-10-10 一种事件系统的创建方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610886180.7A CN106445546B (zh) 2016-10-10 2016-10-10 一种事件系统的创建方法及装置

Publications (2)

Publication Number Publication Date
CN106445546A CN106445546A (zh) 2017-02-22
CN106445546B true CN106445546B (zh) 2019-08-27

Family

ID=58174122

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610886180.7A Active CN106445546B (zh) 2016-10-10 2016-10-10 一种事件系统的创建方法及装置

Country Status (1)

Country Link
CN (1) CN106445546B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN107133025A (zh) * 2017-03-16 2017-09-05 武汉斗鱼网络科技有限公司 一种响应方法和装置
CN108958717B (zh) * 2018-06-28 2023-02-28 深圳数字动能信息技术有限公司 C++事件总线实现方法
CN110764739A (zh) * 2018-07-27 2020-02-07 武汉斗鱼网络科技有限公司 一种静态方法修改非静态对象的方法
CN111581827B (zh) * 2020-05-09 2023-04-21 中国人民解放军海军航空大学 一种面向分布式仿真的事件交互方法及系统

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101464808A (zh) * 2007-12-21 2009-06-24 北京中电华大电子设计有限责任公司 硬件描述语言解释器模块的实现方法
US20130125099A1 (en) * 2011-11-14 2013-05-16 Microsoft Corporation Modular compilation using partial compilers
CN103809938B (zh) * 2012-11-05 2017-08-25 腾讯科技(深圳)有限公司 Python函数运行信息的自动记录方法及系统
CN105022653B (zh) * 2015-07-03 2017-12-12 华中科技大学 一种关于模板库编程约定的检查方法

Also Published As

Publication number Publication date
CN106445546A (zh) 2017-02-22

Similar Documents

Publication Publication Date Title
CN106445546B (zh) 一种事件系统的创建方法及装置
CN110007920B (zh) 一种获取代码依赖关系的方法、装置及电子设备
CN111343181B (zh) 报文的处理方法,系统以及数据池和计算机可读存储介质
US10073646B2 (en) Multi-tier data synchronizer based on concurrent linked list
CN111930382B (zh) 应用页面的接入方法、装置及设备
CN113656357B (zh) 文件管理方法、装置、系统及存储介质
Ghezzi et al. Programming language support to context-aware adaptation: a case-study with Erlang
CN104320312A (zh) 网络应用安全测试工具及模糊测试用例生成方法和系统
CN111443901A (zh) 一种基于Java反射的业务扩展方法及装置
CN105511935B (zh) 资源索引值的获取方法及装置
CN110471780A (zh) 分布式事件处理装置、终端和计算机存储介质
CN112671658A (zh) 数据限流方法、组件及工具包
CN115543479A (zh) 一种适用于动态参数的接口调用解析方法及装置
Keller et al. Implementation and Usage of the PERUSE-Interface in Open MPI
CN110147294A (zh) 调试信息的获取方法、装置、终端及计算机可读存储介质
CN109460215A (zh) 应用控制方法及装置
CN104965786B (zh) 一种应用程序的调试方法、调试主机及运行主机
CN115496470A (zh) 全链路配置化数据处理方法、装置和电子设备
CN116414494A (zh) 业务处理方法、装置、设备及存储介质
CN106020840A (zh) 一种构建混合应用的装置、系统和方法
CN112612511A (zh) 一种多组件合并打包方法及装置
Lupu et al. Agent-based IDMEF alerting infrastructure for distributed intrusion detection and prevention systems: Design and validation
EP2555111A1 (en) Signaling display method and system
CN113010218B (zh) 插件加载方法、装置、计算设备及计算机存储介质
CN110795168B (zh) 一种获取数据的方法及相关装置

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant