VB程序中如何处理随机事件

VB程序中如何处理随机事件,第1张

VB程序中如何处理随机事件,第2张

在编程过程中,如何轻松处理众多的随机事件,往往是制作大型系统首先要考虑的问题之一。用C语言开发Windows程序时,可以很方便地使用消息机制,而在设计VB程序时,就没有这样方便的条件了。例如,当多个窗口同时打开同一个表时,当一个窗口中的数据被修改,而其他窗口可以相应地更新数据时,则需要在所有窗口中广播解释数据变化的消息。如果使用的语言是C,您只需要定义一个UserMessage来实现这一点。但是如果是用VB编程的话,做起来就没那么简单了。一开始我试着这样实现:
我定义了一个消息结构(VbMsg),在程序的主窗体中设置了一个消息广播引擎,主要由一个消息队列和一个定时消息广播器组成。广播器会定期检查消息队列,如果有消息,它会将其发送到所有打开的窗口,并将其从队列中删除。然后定义一个全局消息发送流程(SendMsg),将要发送的消息(VbMsg)发送到消息队列。当需要广播消息时,只需填写消息结构并调用SendMsg过程。这里更复杂的是消息广播器如何将消息发送到每个窗口:它需要一个硬性的规则,每个窗口必须定义一个形式完全相同的消息接收函数(RecMsg),在这个函数中,可以处理接收到的消息,也可以什么都不做。有了这个规定,消息广播器在广播的时候,就可以使用VB系统定义的全局变量Forms来遍历所有的表单,调用每个表单的消息接收函数一次。其外观大致如下:
publicsubendmsgforms(msgasvbmsg)
dimfrmasform
foreachfrminforms
frm . recmsg
nextfrm
endsub
通过以上我在几个早期开发的系统中使用过这种方法,结果基本令人满意。但是,它有几个很大的局限性,当开发一个更大的系统时,它无法满足需求。要点如下:
定时检查消息队列,需要定时器控制触发。当程序运行时,必须牺牲一些效率;
消息广播的范围仅限于一个程序模块。如果将整个系统分成几个大的模块,那么动态连接模块中存在的表单(。DLL)将不能直接接收广播消息。但是,这种方法更不可能实现进程间的消息传递。
消息的接收者只能是一种形式,而作为真正的基本单位——“类”是不能直接接收消息的。
为了打破上述局限,我们必须寻找新的解决方案。好在VB 5.0企业版的推出,给VB增加了很多强大的功能。有几个功能可以帮助我们解决难题。我先介绍一下这些特性:
用户自定义事件:在类模块中,可以使用Event关键字定义用户自定义事件,使用RaiseEvent语句生成事件。这种机制为处理随机事件带来了极大的便利。前面提到的消息广播引擎已经可以不用定时器控制来支持了,而是在接收到需要广播的消息时,生成一个预定义的事件,需要处理消息的object对象只需要拦截事件就可以完成消息的传递。
ActiveXEXE组件:使用VB,可以方便地将共享代码封装在ActiveX组件中。消息广播引擎在一个ActiveX组件中实现,不仅方便在程序中使用,更重要的是可以实现跨进程的消息传输。因为ActiveX组件有内部(DLL)和外部(EXE)两种,对于外部组件,可以共享模块中的全局数据(ActiveX的两种代码组件的区别请阅读VB的在线帮助文件)。
远程自动连接:ActiveX组件是标准的客户机/服务器结构。利用Windows平台的COM模型,VB可以很容易地将这种结构扩展到整个网络。所以我们的消息广播设计,在实现了进程间的消息传输之后,再实现网络上的消息传输,也是可以的。
通过上面的介绍,这种方法的设计思路是清晰的。在具体设计中,我通过四个模块的配合完成了消息的发送、广播和接收,并将这四个模块封装在一个ActiveXEXE组件中。下面是这三个类模块的简介和源代码:
类模块之一:Msg.cls
在这个模块中定义了消息数据结构VbMsg类,它是消息传递中的载体。这只是一个简单的例子。如果想实现更多的功能,比如在两点之间建立一个数据通道而不是简单的广播消息,可能需要扩展这个结构。[/Br/]version 1.0 class[/Br/]BEGIN[/Br/]multi use =-1 ' True[/Br/]END[/Br/]AttributeVB _ Name = " VbMsg "[/Br/]AttributeVB _ global namespace = False[/Br/]AttributeVB _ Creatable = True[/Br/]AttributeVB _ PredeclaredId = False[/Br/]AttributeVB _ Exposed = True[/Br/]option explicit[/Br/]'-[/Br/]' " yyyy . mm . ddhh:mm:ss ")
end property
'设置创建对象时的消息出现时间
private subclass _ initialize()
it = now()
end sub。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VB程序中如何处理随机事件

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情