VB程序中如何处理随机事件
2008-02-23 06:50:38来源:互联网 阅读 ()
自定义了一个消息结构(VbMsg),并在程序的主窗 体内,建立一个消息广播引擎,主要由一个消息队列和一个定时消息广播器所组成。消息广 播器固定隔一定时间检查一次消息队列,如果有消息存在,就将其发送给所有的打开的窗 口,并将该消息从队列中删除。如此再定义一个全局的消息发送过程(SendMsg),将要发送 的消息(VbMsg)送入消息队列。这样当需要广播消息时,只需填充好消息结构,调用SendMsg 过程即可。这里较为复杂的是消息广播器如何将消息发送到各窗口:这需要作个硬性规定, 就是每一个窗体都必须定义一个形式完全相同的消息接收函数(RecMsg),在这个函数中对 接收到的消息进行处理,当然也可以什么都不做。有了这样的规定之后,消息广播器在进行 广播时,就可以是利用VB系统定义的全局变量Forms,遍历所有的窗体,并调用一遍每个窗 体的消息接收函数,其样子大致如下:
Public Sub SendMsgToForms(msg as VbMsg)
Dim frm as Form
For Each frm In Forms
frm.RecMsg msg
Next frm
End Sub
通过上面的这些过程,就可以实现在独立的程序中, 对随机事件进行异步处理。这一方法我曾经在早期开发的几个系统中使用,效果基本还是令 人满意的。但是它有几个较大的局限性,当开发更大一些的系统时,就显得不能够满足需要。 主要有以下几点:
定时检查消息队列,需要利用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类,它是消息 传递中的载体。这里只是一个简单的例子,如果想实现更多的功能,如建立两点间的数据通道, 而不是单纯的广播消息,则可能需要对该结构进行一些扩充。
VERSION 1.0 CLASS
BEGIN
MultiUse = -1 'True
END
Attribute VB_Name = "VbMsg"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Option Explicit
' ---
' 说 明:
'
' 消 息 类: 定 义 全 局 的 消 息 结 构
' ---
Public iType As Long ' 消 息 类 型 编 号
Public iName As String ' 消 息 名
Public iSource As String ' 消 息 源 说 明
Public iDescription As String ' 消 息 说 明
Dim iT As Date ' 消 息 发 生 时 间
' 返 回 日 期 型 时 间
Public Property Get iTime() As Date
iTime = iT
End Property
' 返 回 字 符 型 时 间
Public Property Get iTimeStr() As String
iTimeStr = Format(iT, "yyyy.mm.dd hh:mm:ss")
End Property
' 在 对 象 被 建 立 时, 设 置 消 息 发 生 时 间
Private Sub Class_Initialize()
iT = Now()
End Sub
类模块之二:MsgCli.cls
本模块是对客户接收端MsgClient类的定义,这相当 于一个消息接收器。在这个类中定义的一个RecMsg事件,当接收器收到消息时(过程SetMsg被 调用),就产生这一事件。接收器的建立者就截获这一事件,并处理消息。为了避免接收不必要 的消息,声明了minMsg、maxMsg两个变量,以便对VbMsg中的iType属性进行过滤。
VERSION 1.0 CLASS
BEGIN
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:如何快速导出数据库为EXCEL
下一篇:用VB实现任意修改Win桌面背景
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash