首页> 中国专利> 计算机软件系统中基于构件接口实现事件回调的方法

计算机软件系统中基于构件接口实现事件回调的方法

摘要

本发明涉及一种计算机软件系统中基于构件接口实现事件回调的方法,包括系统在服务端产生目标构件类的回调接口和回调接口中的事件方法的定义信息、在客户端产生与所述的目标构件类的回调接口中的事件方法相对应的回调函数定义信息、在服务端创建所述的目标构件类的对象实例、进行服务端的目标构件类的对象实例中的回调事件和客户端的回调函数之间的关联注册处理操作、根据目标构件类的对象实例的运行激发所述的回调事件并调用与该回调事件相关联注册的回调函数。采用该种计算机软件系统中基于构件接口实现事件回调的方法,实现简单方便,使用灵活,功能强大,性能稳定可靠,适用范围较广泛,给计算机构件化软件系统的进一步发展奠定了坚实的基础。

著录项

  • 公开/公告号CN101196813A

    专利类型发明专利

  • 公开/公告日2008-06-11

    原文格式PDF

  • 申请/专利权人 上海科泰世纪科技有限公司;

    申请/专利号CN200710173114.6

  • 申请日2007-12-26

  • 分类号G06F9/44(20060101);

  • 代理机构31002 上海智信专利代理有限公司;

  • 代理人王洁

  • 地址 201203 上海市浦东新区郭守敬路498号浦东软件园17号楼2层

  • 入库时间 2023-12-17 20:15:19

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-02-15

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20090923 终止日期:20151226 申请日:20071226

    专利权的终止

  • 2011-09-07

    专利权的转移 IPC(主分类):G06F9/44 变更前: 变更后: 登记生效日:20110727 申请日:20071226

    专利申请权、专利权的转移

  • 2009-09-23

    授权

    授权

  • 2008-08-06

    实质审查的生效

    实质审查的生效

  • 2008-06-11

    公开

    公开

说明书

技术领域

本发明涉及计算机软件技术领域,特别涉及计算机构件化软件系统技术领域,具体是指一种计算机软件系统中基于构件接口实现事件回调的方法。

背景技术

在现代的计算机软件技术的发展过程中,回调函数是一项非常有用的编程机制,在程序设计领域已有多年历史,程序开发人员利用这种机制能够编制出各种不同的应用程序,不仅功能强大,而且非常灵活,实现过程简单。

但是,在现有技术中,通常的Windows的消息回调模型,它是完全面向过程的,由发送者决定发送给谁,而接收者只能默默接收并处理所有消息甚至垃圾消息;同时,发送端发送消息、接收端处理消息都需要用户书写大量实现代码,增加了重复劳动,增加了出现漏洞的概率,而且对程序员要求较高。

同时,回调过程中传递的参数是一个LPVOID型指针,不具备类型安全,如果想跨进程还要涉及复杂的共享内存或内存拷贝等问题。

这些问题的存在,就给构件化软件系统中实现更加灵活的回调行为带来了很大的限制。

发明内容

本发明的目的是克服了上述现有技术中的缺点,提供一种完全符合面向构件编程的规范、具有安全的参数类型、能够实现跨越进程边界和跨网络远程回调、回调过程具有广播效果、实现过程简单方便、使用灵活、功能强大、工作性能稳定可靠、适用范围较为广泛的计算机软件系统中基于构件接口实现事件回调的方法。

为了实现上述的目的,本发明的计算机软件系统中基于构件接口实现事件回调的方法如下:

该计算机软件系统中基于构件接口实现事件回调的方法,系统包括服务端和客户端,其主要特点是,所述的方法包括以下步骤:

(1)系统根据用户的输入,在服务端产生目标构件类的回调接口和回调接口中的事件方法的定义信息;

(2)系统根据用户的输入,在客户端产生与所述的目标构件类的回调接口中的事件方法相对应的回调函数定义信息;

(3)系统在服务端创建所述的目标构件类的对象实例;

(4)系统进行服务端的目标构件类的对象实例中的回调事件和客户端的回调函数之间的关联注册处理操作;

(5)系统根据目标构件类的对象实例的运行,激发所述的回调事件,并调用与该回调事件相关联注册的回调函数。

该计算机软件系统中基于构件接口实现事件回调的方法中的回调函数的接口参数包括目标构件类的回调接口中的事件方法的接口参数和目标构件类的对象实例的句柄。

该计算机软件系统中基于构件接口实现事件回调的方法中的系统进行服务端的目标构件类的对象实例中的回调事件和客户端的回调函数之间的关联注册处理操作,包括以下步骤:

(41)系统在服务端生成实现所述的目标构件类的所有回调接口的接口池类;

(42)系统在客户端创建所述的接口池类的对象实例;

(43)将该接口池类的对象实例的句柄传递给服务端,并保存在服务端的回调接口池链表中;

(44)系统在客户端的接口池类的对象实例中进行所述的回调事件和对应的回调函数的关联处理操作。

该计算机软件系统中基于构件接口实现事件回调的方法中的系统在客户端的接口池类的对象实例中进行回调事件和回调函数的关联处理操作,包括以下步骤:

(441)系统根据用户操作,在所述的回调事件和对应的回调函数之间建立关联关系;

(442)将所述的回调事件和对应的回调函数之间建立关联关系保存至客户端的接口池类的对象实例的数据结构中。

该计算机软件系统中基于构件接口实现事件回调的方法中的调用与该回调事件相关联注册的回调函数,包括以下步骤:

(51)系统遍历服务端的回调接口池链表中的每个接口池类的对象实例的句柄,并调用相应的回调接口中的事件方法;

(52)客户端根据系统的调用请求,进行与该回调事件相关联注册的回调函数的异步回调处理操作。

该计算机软件系统中基于构件接口实现事件回调的方法中的客户端进行回调函数的异步回调处理操作,包括以下步骤:

(521)系统根据所述的回调事件,在客户端的接口池类的对象实例中查询相关联的回调函数;

(522)系统根据所述的回调事件和关联的回调函数生成回调消息包;

(523)系统将该回调消息包送入客户端的消息队列中;

(524)客户端的回调工作线程从所述的消息队列中依次取出回调消息包并进行解析,然后调用相应的回调函数。

该计算机软件系统中基于构件接口实现事件回调的方法中的回调消息包中包括回调事件类型、产生回调事件的服务端目标构件类的对象实例、与该回调事件所关联的回调函数的函数指针和该回调函数的参数内容。

采用了该发明的计算机软件系统中基于构件接口实现事件回调的方法,由于其为面向构件编程、基于构件接口设计的事件回调,并将所有的回调函数都封装到接口,每个回调事件对应一个接口方法,从而整个回调模型完全符合面向构件编程的规范,确保了所有的回调方法都具有安全的参数类型,可以跨越进程边界,甚至可以跨网络远程回调;同时,每个回调接口都可以被多个用户、多个进程注册,回调接口所产生的事件会通知所有注册者,并且由于回调过程是异步操作,可以达到类似广播的效果——“同时”调用众多回调函数;每个用户也可以为一个回调事件注册多个回调函数;回调函数既可以是静态函数也可以是普通的C++类成员方法,从而使得构件开发人员不需要为回调接口花费太多精力,只需要在构件类中声明它所实现的哪些接口是回调接口,并确定这些接口都已被定义,那么其在构件实现过程中就可以直接调用回调接口的方法来发布通知、激活事件;而该构件的使用者只需要根据回调接口中的声明来定义自己的回调函数,然后只需要简单的代码即可注册关联所关心的事件,就能够实现事件每次被激发时均会回调相应的回调函数,实现过程简单方便,使用灵活,功能强大,工作性能稳定可靠,适用范围较为广泛,给计算机构件化软件系统的进一步发展奠定了坚实的基础。

附图说明

图1为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的注册回调事件的流程图。

图2为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的注册回调函数的流程图。

图3为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的激发回调事件的流程图。

图4为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的激发回调函数的流程图。

图5为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的产生接口池类的原理示意图。

图6为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的管理回调事件的注册信息的原理示意图。

图7a、7b为本发明的计算机软件系统中基于构件接口实现事件回调的方法中的异步回调模式的工作原理示意图。

具体实施方式

为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。

请参阅图1至图4所示,该计算机软件系统中基于构件接口实现事件回调的方法,系统包括服务端和客户端,该方法包括以下步骤:

(1)系统根据用户的输入,在服务端产生目标构件类的回调接口和回调接口中的事件方法的定义信息;

(2)系统根据用户的输入,在客户端产生与所述的目标构件类的回调接口中的事件方法相对应的回调函数定义信息,该回调函数的接口参数包括目标构件类的回调接口中的事件方法的接口参数和目标构件类的对象实例的句柄;

(3)系统在服务端创建所述的目标构件类的对象实例;

(4)系统进行服务端的目标构件类的对象实例中的回调事件和客户端的回调函数之间的关联注册处理操作,包括以下步骤:

(a)系统在服务端生成实现所述的目标构件类的所有回调接口的接口池类;

(b)系统在客户端创建所述的接口池类的对象实例;

(c)将该接口池类的对象实例的句柄传递给服务端,并保存在服务端的回调接口池链表中;

(d)系统在客户端的接口池类的对象实例中进行所述的回调事件和对应的回调函数的关联处理操作,包括以下步骤:

(i)系统根据用户操作,在所述的回调事件和对应的回调函数之间建立关联关系;

(ii)将所述的回调事件和对应的回调函数之间建立关联关系保存至客户端的接口池类的对象实例的数据结构中;

(5)系统根据目标构件类的对象实例的运行,激发所述的回调事件,并调用与该回调事件相关联注册的回调函数,包括以下步骤:

(a)系统遍历服务端的回调接口池链表中的每个接口池类的对象实例的句柄,并调用相应的回调接口中的事件方法;

(b)客户端根据系统的调用请求,进行与该回调事件相关联注册的回调函数的异步回调处理操作,包括以下步骤:

(i)系统根据所述的回调事件,在客户端的接口池类的对象实例中查询相关联的回调函数;

(ii)系统根据所述的回调事件和关联的回调函数生成回调消息包,该回调消息包中包括回调事件类型、产生回调事件的服务端目标构件类的对象实例、与该回调事件所关联的回调函数的函数指针和该回调函数的参数内容;

(iii)系统将该回调消息包送入客户端的消息队列中;

(iv)客户端的回调工作线程从所述的消息队列中依次取出回调消息包并进行解析,然后调用相应的回调函数。

在实际应用当中,请参阅图1所示,对于注册回调事件,包括以下步骤:

·  用户首先根据目标构件的回调事件的声明,定义自己的回调函数,回调函数的参数比构件中声明的多一个参数pSender,为激发此事件的构件对象的句柄;

·  实例化目标构件类对象;

·  向该对象注册回调事件,表示对其可能发生的数字键按下的事件感兴趣,如果发生此事件则回调用户所定义的回调函数NumberKeyDown(…);

·  用户的代码结束,当执行到Return语句,系统接管,该线程进入处理消息的循环。再请参阅图2所示,对于注册回调函数,包括以下步骤:

·  用户调用注册回调的函数;

·  注册函数内部会创建一个CKeyboardSink的实例;

·  调用构件对象的Aggregate方法将SinkObject的句柄传递给Server端,Server端会将此句柄保存在一个链表中,当需要回调用户时遍历此链表,通过保存的SinkObject句柄逐个回调;

·  Client端调用SinkObject的AddCallback方法注册回调信息,比如针对哪个事件注册关联哪个回调函数。

再请参阅图3所示,对于激发回调事件,包括以下步骤:

·  在CAR文件中声明该构件的回调事件接口以及可能产生此事件的构件类;

·  在适当位置调用CAR文件中声明的回调事件的方法;

·  该方法会向所有注册该事件的Client端投递一个消息,包含发送者、参数等信息;

·  Client端的消息处理线程会逐个分析处理消息,并调用用户之前注册的回调函数。

再请参阅图4所示,对于激发回调函数,包括以下步骤:

·  Server端在适当时机调用回调函数OnNumberKey(9);

·  在OnNumberKey()内部会遍历之前保存过的SinkObject句柄,该句柄是IKeyEvent接口指针,指向的是先前注册时创建的CKeyboardSink类对象;获得IKeyEvent接口指针后,调用IKeyEvent的OnNumberKey()接口方法,即,调用CKeyboardSink::OnNumberKey()。当前代码执行是在Server端,而CKeyboardSink类对象被创建在Client端,此调用为通过接口的远程调用;

·  Client端的CKeyboardSink::OnNumberKey()的实现里,负责构造一个消息包,将所发生的事件类型、产生事件的构件对象、用户先前注册的回调函数的函数指针,以及回调参数内容;

·  CKeyboardSink::OnNumberKey()构造完消息包以后会立即调用一个API将此消息包投递给注册过该事件的Client端,将此消息压入对方的消息队列;

·  投递完消息后返回到Server端,继续执行之后的代码。而至于此刻Client端是否开始执行事件回调或者回调函数是否执行完成都不能预期,这就是所谓的异步回调过程。

再请参阅图5所示,构件编译工具编译Server端构件的定义文件时会自动生成一个CKeyboardSink类,该类将实现所有回调接口(比如IKeyEvent),当Client端注册回调时会创建一个CKeyboardSink类的实例SinkObject,再调用Server端的Aggregate方法注册此SinkObject的IKeyEvent句柄,Server端将IKeyEvent句柄保存到本地链表;当Server端激发事件回调时,会通过保存的IKeyEvent句柄调用回调,因为该IKeyEvent接口是由CKeyboardSink实现的,所以,Server端最终回调到CKeyboardSink的代码。

也就相当于在Client端也构造了一个构件类CKeyboardSink,提供IKeyEvent接口,Server端激发回调的时候就调用此接口,所以说回调过程是基于接口的,可以跨进程和参数类型安全的。

虽然CKeyboardSink是在Server端定义实现的,但它是被创建在Client端的地址空间里,它可以直接向接收者投递“事件被激发”的消息而不必再跨越进程边界。

再请参阅图6所示,Client端还通过SinkObject管理事件回调的注册信息,它负责一个构件类实例在这个进程内的所有回调注册信息的管理。用户注册一个回调事件的信息就被保存在SinkObject的内部数据结构上。

而SinkObject在第一次注册操作时被创建实例,之后每次操作都是针对该实例。在它创建之时就向Server端构件递交请求建立关联,构件将SinkObject的句柄关联上自己的回调事件,当之后任何事件被激发都会通知SinkObject,再由SinkObject根据注册信息通知用户的工作线程。

再请参阅图7a和图7b所示,为了实现异步回调模式,接收者有一个专门的工作线程和一个消息队列,SinkObject会将发生事件的消息放到消息队列,然后立即返回Server端;工作线程会逐个处理消息队列中的事件消息,每个消息对应一个被激发的事件,消息中封装了对应的回调函数,工作线程会按顺序调用它们,直到消息队列为空。

这段代码会循环处理消息队列中的所有消息,每个消息都代表Server构件的一次激活通知,每个消息都包含着:消息类型、消息发送者、对应的回调函数、函数参数内容等等。每次有事件被激活的消息都是被投递到这个消息队列中,再由这段代码负责解析消息内容,逐个调用回调函数。

从而,在构件内部,当它激发了某种事件,构件会调用所有关联着的SinkObject,再由SinkObject向注册过该事件的用户线程投递消息,放入消息队列后立即返回。

用户的工作线程发现新消息后就会从队列弹出消息,解析消息结构,获得相关联的回调函数和参数的信息,调用用户注册的回调函数。到此就完成了一次回调。

对于本发明的方法,在进行使用的过程中,对于一次事件回调过程包括:事件发送者,事件接收者,事件本身和回调函数。

一个提供某种功能的构件,在使用过程中可能会激发某些事件来通知调用者,比如一个邮件服务的构件,当邮件到来时要通知构件使用者“有新邮件”;再比如一个键盘事件的服务构件,每当有按键被按下都会抛出事件通知。那么这些构件就可以看作是事件发送者,由于这些构件都提供某些功能和服务,也称它们为Server端。相应的调用和使用该构件的一边就称为Client端,它们是消息接收者,并根据业务逻辑处理消息。

对于不同的事件需要附带不同的信息和数据,Windows的做法是传递一个LPVOID指针再由用户自由发挥;而本发明的回调实现方法是完全基于构件接口,有专门的回调接口和方法,完全由用户根据需要自由定义,而基于接口方法的回调方式,还可以保证传递参数的类型安全。

使用回调功能将非常简单。首先,构件的作者要在构件定义文件中“声明”出自己有哪些回调事件接口,以及包含哪些回调事件及回调方法。然后在构件类中使用“callback”关键字声明该接口,那么该构件类就具有回调接口,就可能会抛出被声明的回调接口中所定义的事件。比如一个键盘服务的构件,在它的构件定义文件中做如下声明和定义:

interface IKeyEvent{    //定义构件的接口

       OnNumberKey(Int32 KeyValue);    //声明接口方法

       OnCharacterKey(AChar KeyValue);

}

class CKeyboard{    //定义一个构件类

   interface IKeyboard;    //声明该类实现该接口

   callback interface IKeyEvent;    //声明该类具有IKeyEvent回调接口

}

然后,在构件中适当的时机调用回调函数。比如这个键盘服务的构件,它的构件类CKeyboard具有IKeyEvent回调接口,那么在这个构件类的实现里,如果发现数字键被按下,它可以调用OnNumberKey(KeyValue),如果有字符键被按下,  它可以调用OnCharacterKey(KeyValue)。这些就代表用户的回调函数,如果有用户注册了这两个事件,他的回调函数就会被调用执行,但请注意,由于是异步的回调模型,CKeyboard在调用这两个函数时不会阻塞在这里等待用户的回调函数执行完成,而是立即返回,至于OnNumberKey和OnCharacterKey返回之后用户的回调函数是否被调用或是否已执行完成,这些都是无法预期的。这也是异步回调与同步回调最大的区别。

最后,使用这个构件的用户可以通过查看相关声明或产品说明等途径获知该构件会在何种情况下产生哪种事件,使用者可以根据需要定义自己的回调函数,并通过一个注册过程将回调函数与构件和回调事件关联起来。比如说,调用构件的客户端程序关心数字键被按下的事件,希望获得这个事件发生的通知,那么它就可以调用回调事件注册函数,将自己定义的回调函数与这个事件相关联,比如下面这句代码:

CKeyboard::AddOnNumberKeyCallback(pKeyboard,  NumberKeyDown);

其中,“CKeyboard”表示要注册哪个构件类的事件,函数名称中的“Add”表示是注册操作,对应的解除注册操作是“Remove”;函数名中的“OnNumberKey”表示注册哪个事件,如果注册字符按键的事件就是“OnCharacterKey”;函数第一个参数pKeyboard是一个CKeyboard构件类的对象指针,因为用户可能创建多个键盘服务对象,必须指明我们关心哪个对象;第二个参数NumberKeyDown是一个由用户定义的回调函数,当事件发生时这个函数会被调用,它的声明与构件的CAR文件中所定义的OnNumberKey(In32 KeyValue)保持相同。

采用了上述的计算机软件系统中基于构件接口实现事件回调的方法,由于其为面向构件编程、基于构件接口设计的事件回调,并将所有的回调函数都封装到接口,每个回调事件对应一个接口方法,从而整个回调模型完全符合面向构件编程的规范,确保了所有的回调方法都具有安全的参数类型,可以跨越进程边界,甚至可以跨网络远程回调;同时,每个回调接口都可以被多个用户、多个进程注册,回调接口所产生的事件会通知所有注册者,并且由于回调过程是异步操作,可以达到类似广播的效果——“同时”调用众多回调函数;每个用户也可以为一个回调事件注册多个回调函数;回调函数既可以是静态函数也可以是普通的C++类成员方法,从而使得构件开发人员不需要为回调接口花费太多精力,只需要在构件类中声明它所实现的哪些接口是回调接口,并确定这些接口都已被定义,那么其在构件实现过程中就可以直接调用回调接口的方法来发布通知、激活事件;而该构件的使用者只需要根据回调接口中的声明来定义自己的回调函数,然后只需要简单的代码即可注册关联所关心的事件,就能够实现事件每次被激发时均会回调相应的回调函数,实现过程简单方便,使用灵活,功能强大,工作性能稳定可靠,适用范围较为广泛,给计算机构件化软件系统的进一步发展奠定了坚实的基础。

在此说明书中,本发明已参照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号