《基于微网可视化平台的插件实现方法.pdf》由会员分享,可在线阅读,更多相关《基于微网可视化平台的插件实现方法.pdf(12页珍藏版)》请在专利查询网上搜索。
1、(10)申请公布号 CN 103164239 A(43)申请公布日 2013.06.19CN103164239A*CN103164239A*(21)申请号 201210537056.1(22)申请日 2012.12.11G06F 9/445(2006.01)(71)申请人广东电网公司电力科学研究院地址 510080 广东省广州市越秀区东风东路水均岗8号申请人天津天大求实电力新技术股份有限公司(72)发明人胡亚平 高雅 刘振国 陈炯聪余南华 黄曙 陈皓 谢国财刘菲 夏亚君 黄缙华 徐兴辉刘玮 李双佑 田艳华(74)专利代理机构广州华进联合专利商标代理有限公司 44224代理人王茹 曾旻辉(54)。
2、 发明名称基于微网可视化平台的插件实现方法(57) 摘要本发明提供一种基于微网可视化平台的插件实现方法通过插件管理类加载插件,插件加载方式包括多个插件简单加载、一个插件简单加载、遍历目录下插件加载、静态库插件加载和通过配置文件对插件进行加载。插件中包括消息、命令、事件和接口功能,并通过上述功能实现菜单、工具条等界面交互和组件间功能调用。通过智能指针维护组件生命周期,保证数据的健壮性、安全性和唯一性。提供了静态库插件加载功能,这样发布软件时只需要一个主程序文件,在内部则是由多个静态库模块组成,这样既能发挥插件的可重用优点,又能减少程序文件数量,能够使插件提供跨平台支持,提高程序的复用性。适用于解。
3、决微网可视化平台与各个不同子系统插件的耦合。(51)Int.Cl.权利要求书1页 说明书6页 附图4页(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书1页 说明书6页 附图4页(10)申请公布号 CN 103164239 ACN 103164239 A1/1页21.一种基于微网可视化平台的插件实现方法,其特征在于,包括以下步骤:应用程序加载插件管理器,向所述插件管理器发送插件的加载请求;所述插件管理器根据所述加载请求向对应的插件发出加载消息;接收所述加载消息的插件在所述插件管理器中完成注册;所述插件管理器向已注册的插件请求获取所述插件的接口类,并加载所述接口类;请求获取所述插。
4、件的组件类注册列表,并根据所述组件类注册列表在所述插件管理器中注册对应的组件类。2.如权利要求1所述的基于微网可视化平台的插件实现方法,其特征在于,所述插件的接口类由纯虚函数组成,并且具有一个由GUID字符串定义的常量名作为组件类ID。3.如权利要求2所述的基于微网可视化平台的插件实现方法,其特征在于,所述插件的组件类从所述接口类继承,实现组件类中定义的接口函数,并且所述组件类的构造函数为保护型。4.如权利要求1所述的基于微网可视化平台的插件实现方法,其特征在于,所述应用程序加载插件管理器的步骤包括:所述应用程序检验插件管理类是否加载,如果没有加载,则加载所述插件管理类并获取所述插件管理类的指。
5、针,如果已加载则直接获取所述指针。5.如权利要求1所述的基于微网可视化平台的插件实现方法,其特征在于,所述插件管理器加载插件的方式包括多个插件加载、单个插件加载;遍历目录下所有插件加载、静态库插件加载和通过配置文件对插件进行加载。6.如权利要求1所述的基于微网可视化平台的插件实现方法,其特征在于,在所述插件管理器中注册对应的组件类之后进一步包括一个初始化的步骤,具体包括:初始化消息、命令、接口和事件,并通过系统定义消息在平台中扩展菜单和工具栏。7.如权利要求6所述的基于微网可视化平台的插件实现方法,其特征在于,在收到应用程序关闭消息时,所述插件管理器则按照插件加载顺序逆序向各个插件发送释放插件。
6、消息,各个插件收到所述释放插件消息后释放内存,向所述插件管理器返回释放成功消息,所述插件管理器收到所述释放成功消息后向平台返回该消息。8.如权利要求1所述的基于微网可视化平台的插件实现方法,其特征在于,进一步包括以下步骤:加载事件管理器;各个所述插件接收所述插件管理器发送的初始化消息,向所述事件管理器注册相应的事件和响应函数;当所述事件被触发时,直接受事件驱动的插件向所述事件管理器发送数据和通知消息;所述事件管理器根据所述通知消息,向已注册的各个插件发送数据,各个所述插件接收所述数据后执行相应的响应函数进行处理。权 利 要 求 书CN 103164239 A1/6页3基于微网可视化平台的插件实。
7、现方法技术领域0001 本发明涉及电力系统的微网可视化平台应用的技术领域,特别是涉及一种基于微网可视化平台的插件实现方法。背景技术0002 插件技术的出发点主要是为了使软件能够灵活地进行扩展功能,而不需要对主程序(框架程序)进行重新编译和发布。软件的功能由框架程序和插件来决定。在框架程序和插件之间具有一个特定的接口,它们两者须通过这个接口来传递数据或控制信息,以实现软件功能。0003 目前的插件多为单一环境运行,不提供操作系统跨平台支持。同时,插件多为定制开发,与框架耦合度高,不利于程序、功能的复用,同时各插件之间通讯方式繁琐,开发工作复杂,容易出现错误。发明内容0004 针对上述背景技术中存。
8、在的问题,本发明的目的在于提供一种基于微网可视化平台的插件实现方法,能够使插件提供跨平台支持,提高程序的复用性。0005 一种基于微网可视化平台的插件实现方法,包括以下步骤:0006 应用程序加载插件管理器,向所述插件管理器发送插件的加载请求;0007 所述插件管理器根据所述加载请求向对应的插件发出加载消息;0008 接收所述加载消息的插件在所述插件管理器中完成注册;0009 所述插件管理器向已注册的插件请求获取所述插件的接口类,并加载所述接口类;请求获取所述插件的组件类注册列表,并根据所述组件类注册列表在所述插件管理器中注册对应的组件类。0010 本发明的基于微网可视化平台的插件实现方法中,。
9、通过所述插件管理器对各个插件进行管理,在应用程序加载插件时,可以通过所述插件管理器进行一个插件加载、多个插件加载、遍历插件目录加载等多种插件加载方式。并且各个插件在所述插件管理器中完成注册后,所述插件管理器先记载所述插件的接口类,再加载所述插件的组件类,则各个插件之间可以通过所述接口类完成插件之间的交互功能,插件间可通过特定方式通讯、调用、交互。提供了静态库插件加载功能,这样发布软件时只需要一个主程序文件,在内部则是由多个静态库模块组成,这样既能发挥插件的可重用优点,又能减少程序文件数量,能够使插件提供跨平台支持,提高程序的复用性。附图说明0011 图1是本发明基于微网可视化平台的插件实现方法。
10、的流程示意图;0012 图2是本发明的基于微网可视化平台的插件实现方法中事件驱动的流程图;0013 图3是本发明的一个实施例中插件加载过程的流程示意图;说 明 书CN 103164239 A2/6页40014 图4是本发明的一个实施例中事件驱动的执行流程。具体实施方式0015 请参阅图1,图1是本发明基于微网可视化平台的插件实现方法的流程示意图。0016 所述基于微网可视化平台的插件实现方法,包括以下步骤:0017 S101,应用程序加载插件管理器,向所述插件管理器发送插件的加载请求;0018 S102,所述插件管理器根据所述加载请求向对应的插件发出加载消息;0019 S103,接收所述加载消。
11、息的插件在所述插件管理器中完成注册;0020 S104,所述插件管理器向已注册的插件请求获取所述插件的接口类,并加载所述接口类;请求获取所述插件的组件类注册列表,并根据所述组件类注册列表在所述插件管理器中注册对应的组件类。0021 本发明程序框架与插件的耦合并同时实现了各个插件之间、平台和插件之间的相互调用,从而提高了系统的健壮性、稳定性、扩展性和程序的复用性,减少了代码开发量,方便了系统的复用、扩展。尤其适合于解决微网可视化平台与各个不同子系统插件的耦合的问题。0022 其中,对于步骤S101,通过所述插件管理器对相关组件类ID和组件类创建的接口函数指针进行管理。优选使用Boost函数库中的。
12、智能指针类boost:share_ptr对函数的生命周期进行维护管理。插件生命周期包括程序启动时插件的加载(构造),程序运行中插件的调用和程序退出时插件的释放(析构)。在步骤S101中,程序首先校验插件管理类(PluginManager)是否加载,如果没有加载则加载所述插件管理类,并获取该类指针,如果已加载则直接获取到该类指针。0023 所述插件管理类加载插件的方式有多种,包括多个插件简单加载、一个插件简单加载、遍历目录下插件加载、静态库插件加载和通过配置文件对插件进行加载。例如:0024 0025 对于步骤S102,所述插件管理器根据所述应用程序发送的加载请求向对应的插件发出加载消息;002。
13、6 各个接收所述加载消息的插件在接收到所述加载消息之后,向所述插件管理器发送确认信息。0027 对于步骤S103,所述插件管理器对接收到所述加载消息的插件进行注册。说 明 书CN 103164239 A3/6页50028 对于步骤S104,插件创建是整个插件框架的核心,各个插件和平台可通过接口实现插件间、平台和插件间功能调用。0029 优选地,所述插件的接口类由纯虚函数组成,并且具有一个由GUID字符串定义的常量名作为组件类ID。0030 亦即,定义插件接口类时,所述插件接口类没有基类,没有显式的接口函数,没有成员变量,全部由纯虚函数组成。同时直接使用GUID字符串定义一个常量名,需要用到组件。
14、类ID时使用该常量名,不依赖于编译环境;例如:0031 0032 所述插件的组件类优选从所述接口类继承,实现组件类中定义的接口函数,并且所述组件类的构造函数为保护型。0033 亦即,定义所述插件的组件类时,所述插件的组件类从接口类继承,实现组件类中定义的接口函数。为了针对组件编程将类的构造函数设为保护类型。一个组件类可以实现多个接口,组件类可以被继承。0034 0035 所述插件管理器加载所述接口类和对应的组件类,完成对插件加载。0036 优选地,在完成插件的加载之后,进一步包括一个初始化的步骤,具体包括:0037 初始化消息、命令、接口和事件,并通过系统定义消息在平台中扩展菜单(Menu)和。
15、工具栏(ToolBar)。0038 当系统收到应用程序关闭消息时,所述插件管理器则按照插件加载顺序逆序向各个插件发送释放插件消息,各个插件收到所述释放插件消息后释放内存,向所述插件管理器返回释放成功消息。当插件管理器收到所有返回成功消息后向平台返回消息,系统可关说 明 书CN 103164239 A4/6页6闭。0039 本发明中“消息”实现了平台对一个插件、平台对多个插件、一个插件对平台之间的调用,插件间的相互调用采用“接口”进行。本发明中对“接口”进行扩展提出“事件(Event)”,实现多个插件的函数回调以实现一个插件对多个插件的调用,下面介绍事件驱动模型:0040 第一:事件驱动的原理。。
16、0041 定义事件类型主要是定义唯一的字符串以便区分不同的事件,同时为了在编译阶段识别格式错误,自动定义了内部类型。注册响应函数是将多个相同格式的响应函数(回调函数)记录下来,同时关联到一个事件类型字符串。触发事件就是根据事件类型字符串找到对应的响应函数,按注册先后顺序依次调用这些响应函数(同步调用方式),将事件参数传到响应函数的形参。本发明通过Boost库中Signal2、Function和Bind类库组合实现。0042 第二:定义事件类型。0043 在一个头文件中可定义多个事件类型,例如:0044 0045 在该文件中首先包含Triggerevent.h,然后使用DEFINE_EVENT_。
17、1等宏定义每一个事件类型,使用格式如下:0046 DEFINE_EVENT_0、_1、_2对应的响应函数的返回值类型为void,每个响应函数都将依次调用。0047 DEFINE_EVENT_0(事件名称,事件名称标识后缀);0048 DEFINE_EVENT_1(事件名称,形参类型,事件名称标识后缀);0049 DEFINE_EVENT_2(事件名称,形参类型1,形参类型2,事件名称标识后缀);0050 事件名称将用于定义一个内部结构体和事件触发的辅助类(类名以Trigger开头),在触发和响应事件时将使用该事件名称;形参类型为响应函数的形参类型,最多两个形参,可以使用普通类型(例如char*。
18、、int),或引用类型(例如string&,const MyObj&);事件名称标识后缀用于避免不同模块中出现相同的事件名称,内部将事件名称和标识后缀组合形成一个不重复的字符串常量,例如“EventAdd.login.plg“、“EventAdd.login.plg“。0051 第三:注册响应函数。0052 使用静态函数来响应简单事件类型,函数的返回值类型和形参列表必须与事件类型的定义一致。可使用普通全局函数或类的静态函数,例如:说 明 书CN 103164239 A5/6页70053 void InsertNodeFunc(int& result).0054 void MyClass:Ins。
19、ertNode(int& result).0055 在响应函数所在模块的InitializePlugin()函数或其他函数中注册这些响应函数到对应的事件类型上。使用REGISTER_OBSERVER宏注册响应函数,例如:0056 0057 在响应函数所在模块的入口函数CPP文件(module.cpp或main.cpp,包含了pluginimpl.h或实现类createObject函数)中,需要包含observerimpl.h文件,在该模块中只能在一个CPP文件中包含observerimpl.h文件:#include。0058 因此,本发明的基于微网可视化平台的插件实现方法在完成插件加载之后,可。
20、进一步包括以下步骤,如图2所示:0059 S201,加载事件管理器;0060 S202,各个所述插件接收所述插件管理器发送的初始化消息,向所述事件管理器注册相应的事件和响应函数;0061 S203,当所述事件被触发时,直接受事件驱动的插件向所述事件管理器发送数据和通知消息;0062 S204,所述事件管理器根据所述通知消息,向已注册的各个插件发送数据,各个所述插件接收所述数据后执行相应的响应函数进行处理。0063 本发明的基于微网可视化平台的插件实现方法适用于解决电力系统微网可视化平台与各个不同子系统插件的耦合。通过插件管理类加载插件,插件加载方式包括多个插件简单加载、一个插件简单加载、遍历目。
21、录下插件加载、静态库插件加载和通过配置文件对插件进行加载。插件中包括消息(Message)、命令(Command)、事件(Event)和接口(Interface)功能,并通过上述功能实现菜单(Menu)、工具条(ToolBar)等界面(UI)交互和组件间功能调用。通过智能指针(SharePtr)维护组件生命周期,保证数据的健壮性、安全性和唯一性。0064 因此,具有以下优点:0065 1)接口定义简单灵活,采用普通的C+接口,即由纯虚函数组成的结构体,不需要特殊的基类;同时可以使用C+的各种变量类型,不受COM接口那样的约束。0066 2)接口与基于微网可视化平台的插件实现分离,向外部提供接口。
22、头文件,而在内部可以由一个组件来实现一个或多个接口,不需要对外导出该类或暴露实现细节。可以让多个模块并行开发,模块相互之间不存在编译依赖(不需要其他插件的LIB等文件)。0067 3)采用Boost智能指针来维护接口的生命周期,可从一个接口动态转换为另一个说 明 书CN 103164239 A6/6页8接口,可以区分是来自于外部插件的引用还是来自于插件内部的引用。0068 4)组件透明部署,一个组件只需要使用其他组件的接口,不需要关心该接口是在哪个插件中实现的。可以根据需要将各个实现类进行合并或拆分,使其分布到不同插件中,而接口使用者不受影响。另外,插件部署于哪个目录也不影响插件接口的使用。0。
23、069 5)模块可替换、可扩展。可根据需要替换某个插件,只要该基于微网可视化平台的插件实现了相同的接口,即使内部功能不相同。这样就实现了插件可替换、按需组合的功能。通过在新的插件中支持更多的接口,可扩展更多的功能。可以在新插件中局部替换原有插件的某些接口或部分函数,实现重用和扩展。0070 下面以具体的流程说明本发明的基于微网可视化平台的插件实现方法:0071 请参阅图3和图4,图3是本发明的一个实施例中插件加载过程的流程示意图;0072 首先应用程序Application请求并加载插件管理器LoadPlugInManager,加载完成后,发出加载插件的消息LoadPlugIns。所述插件管理。
24、器PlugInManager根据所述加载请求向对应的A插件和B插件发出加载消息LoadPlugIn;A插件响应所述加载消息返回确认消息LoadPlugInEx,所述插件管理器对A插件完成注册RegisterPlugIn,请求获取所述插件的接口类GetModuleInterface,并加载所述接口类AddModule;请求获取所述插件的组件类注册列表RegisterClassEntryTable、GetClassEntryTable,并根据所述组件类注册列表在所述插件管理器中注册对应的组件类RegisterClass。完成加载后,发送初始化消息InitPlugIn,进行初始化。0073 图4是本。
25、发明的一个实施例中事件驱动的执行流程。0074 所述插件管理器发送初始化消息InitPlugIn至各个插件,其中C插件为直接受事件驱动的插件,A插件和B插件为受C插件回调的插件。A插件和B插件收到所述初始化消息InitPlugIn之后,向事件管理器ChangeManager注册相应的事件和响应函数RegisterObserver;0075 当触发事件时,直接受事件驱动的C插件向所述事件管理器发送数据和通知消息Data:Notify()、ChangeNotify;所述事件管理器根据所述通知消息,向已注册的A插件和B插件发送数据Updata(),所述A插件和B插件接收所述数据后执行相应的响应函数进。
26、行处理,响应所述事件OnEnventX()。0076 本领域普通技术人员可以理解实现上述实施方式中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各实施方式的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。0077 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。说 明 书CN 103164239 A1/4页9图1说 明 书 附 图CN 103164239 A2/4页10图2说 明 书 附 图CN 103164239 A10。