自定义了一个消息结构(VbMsg),并在程序的主窗体内,建立一个消息广播引擎,主要由一个消息队列和一个定时消息广播器所组成。消息广播器固定隔一定时间检查一次消息队列,如果有消息存在,就将其发送给所有的打开的窗口,并将该消息从队列中删除。如此再定义一个全局的消息发送过程(SendMsg),将要发送的消息(VbMsg)送入消息队列。这样当需要广播消息时,只需填充好消息结构,调用SendMsg过程即可。这里较为复杂的是消息广播器如何将消息发送到各窗口:这需要作个硬性规定,就是每一个窗体都必须定义一个形式完全相同的消息接收函数(RecMsg),在这个函数中对接收到的消息进行处理,当然也可以什么都不做。有了这样的规定之后,消息广播器在进行广播时,就可以是利用VB系统定义的全局变量Forms,遍历所有的窗体,并调用一遍每个窗体的消息接收函数,其样子大致如下:
PublicSubSendMsgToForms(msgasVbMsg)
DimfrmasForm
ForEachfrmInForms
frm.RecMsgmsg
Nextfrm
EndSub
通过上面的这些过程,就可以实现在独立的程序中,对随机事件进行异步处理。这一方法我曾经在早期开发的几个系统中使用,效果基本还是令人满意的。但是它有几个较大的局限性,当开发更大一些的系统时,就显得不能够满足需要。主要有以下几点:
定时检查消息队列,需要利用Timer控件进行触发。这在程序运行时,就必然要牺牲一部分效率;
消息广播的范围限定在一个程序模块内,如果整个系统分成多个大的模块,那么存在于动态连接模块(.DLL)中的窗体,将不能直接接收到广播消息。而要想实现进程间的消息传递,这一方法就更加不可能;
消息的接收者只能是窗体,而做为真正的基础单元--“类”却无法直接接收消息。
为了打破上面的几点局限性,就必须寻找新的解决办法。非常庆幸的是,VB5.0企业版的推出,给VB增添了许多强有力的特性,有几点特性,正好可以帮助我们解决难题。先让我介绍一下这几个特性:
用户自定义事件:在类模块中,可以使用Event关键字来定义用户自定义事件,使用RaiseEvent语句来产生该事件,这一机制给处理随机事件带来极大的方便。上面说的消息广播引擎,就可以不再使用Timer控件做支持,而是当收到需要广播的消息时,产生一个预定义的事件,而需要处理消息的客体对象,只需截获该事件,就完成了消息的传递。
ActiveXEXE部件:利用VB,可以方便地将共享代码封装在ActiveX部件之中。将消息广播引擎实现于一个ActiveX部件之中,不仅方便了在程序中使用,而且更为重要的一点是,可以实现跨进程间的消息传递。因为ActiveX部件有内部(DLL)外部(EXE)两种,对于外部部件,可以对模块内的全局数据实现共享(关于ActiveX两种代码部件的区别,请阅读VB的联机帮助文件)。
远程自动化连接:ActiveX部件,是一种标准的客户机/服务器结构,利用Windows平台的COM模型,VB已能方便地将这种结构扩展到整个网络的范围。所以,我们的消息广播设计,在实现了进程间的消息传递之后,进而实现网络上的消息传递,也成为可能。
通过上面的几点介绍,这一方式的设计思想也就比较清楚了,在具体设计时,我通过四个模块之间的相互协作,完成了消息的发送、广播及接收,并将这四个模块封装在一个ActiveXEXE部件之中。下面就是这三个类模块的简单介绍及源代码:
类模块之一:Msg.cls
在该模块中,定义了消息数据结构VbMsg类,它是消息传递中的载体。这里只是一个简单的例子,如果想实现更多的功能,如建立两点间的数据通道,而不是单纯的广播消息,则可能需要对该结构进行一些扩充。
VERSION1.0CLASS
BEGIN
MultiUse=-1'True
END
AttributeVB_Name="VbMsg"
AttributeVB_GlobalNameSpace=False
AttributeVB_Creatable=True
AttributeVB_PredeclaredId=False
AttributeVB_Exposed=True
OptionExplicit
' ---
'说明:
'
'消息类:定义全局的消息结构
' ---
PubliciTypeAsLong'消息类型编号
PubliciNameAsString'消息名
PubliciSourceAsString'消息源说明
PubliciDescriptionAsString'消息说明
DimiTAsDate'消息发生时间
'返回日期型时间
PublicPropertyGetiTime()AsDate
iTime=iT
EndProperty
'返回字符型时间
PublicPropertyGetiTimeStr()AsString
iTimeStr=Format(iT,"yyyy.mm.ddhh:mm:ss")
EndProperty
'在对象被建立时,设置消息发生时间
PrivateSubClass_Initialize()
iT=Now()
EndSub
本文来自 280文秘网(https://www.it280.com),转载请保留网址和出处
【VB程序中如何处理随机事件】相关文章:
学校中层竞聘演讲稿02-06
初中入团申请书怎么写600字02-06
2023年山东滨州博兴县公用事业集团有限公司权属企业公开招聘工作人员公告(43人)02-06
英语口语8000句 35 商业信函:收到信件常用口语句子(MP3)02-06
初中军训感想600字作文02-06
2021浙江省温州市市级事业单位面向社会招聘公告【127人】02-06
2024年浙江金华义乌市中心医院质量管理科、内镜中心招聘非编人员2人公告02-06
山东烟台2020年冬季普通高中学业水平考试准考证打印时间:2021年1月8日-19日02-06
小议中小型水厂自动化科技整改02-06
