解析VB的事件驱动编程
2008-02-23 06:51:53来源:互联网 阅读 ()
本文我们将通过Visual Basic和 BetterState For Visual Basic来设计一个简单的例子。这个例子的主要目的是在BetterState环境下设计状态图。对于用户来说,就是建立设计的Visual Basic前端部分。
在这个例子中我们使用VB代码生成器,因为这种代码生成器是每个版本的BetterState Pro都提供的。
考虑一个简单的例子:一个VB窗口,包含一个标准的Visual Basic定时器控件,命名为Timer1;和一个自定义图片控件,用来表示一个交通灯,命名为Light1。它可以是绿色或红色。假设我们希望信号灯在每次Timer事件发生时,在红绿之间变换。这种行为很容易用状态机来模拟,并可视化地表现为一张状态图,如图1所示。
图1 简单的两个状态的交通灯控制器
状态机从Green状态开始,每次Timer1_Timer事件(固定时间间隔)发生,状态机在Red Green两个状态间交替转换,因此适当地改变Light1的Color属性。很显然,我们可以在Timer1_Timer事件中使用简单的VB代码来达到同样的结果,编写子程序,使用一个变量,命名为LightState,它的值为0或1,使用if-then-else语句交替的改变变量的值。
If (LightState=0) Then LightState = 1 Light1.Color = 1 ‘RED Else LightState = 0 Light1.Color = 0 ‘GREEN End If
实际上,这就是BetterState代码生成器将自动为你所作的工作;你只要画出状态图,代码生成器会自动生成代码。不过,图形化编程手段的好处不仅仅是这些,让我们考虑一个复杂一点的例子。
第一个扩展的例子如图2所示,增加了以下修改:
两个控制按钮,分别命名为NewTruck和NewCar;
点击NewCar 按钮3次后Light1从Red变 Green,或者在点击一次或数次NewCar后再点击NewTruck。
图2 修改后的交通灯控制器
图18展示了能够描述这种行为的扩展状态图。注意在图中增加了层次结构,连接OneORMore状态和Green状态的转换意味着如果点击一次或多次New-Car(令当前状态是OneORMore的子状态之一)。又点击了NewTruck,状态就会变为Green。
这种层次设计功能允许任何VB用户练习掌握现代编程的最基本概念之一,即自顶向下设计。例如,它允许你设计一个仅由Green和Red状态组成的高层状态图,然后再设计Red状态的内容,或将设计OneORMore状态内容的任务分配给其他人。
注意扩展状态图是如何记忆输入事件序列,并通过可视的图来表现这些序列的。这是各种状态机的基本使命之一。
扩展状态图在其他很多方面也很有用,它们提供的另一个重要服务是捕获并发,特别是部分并发的输入事件序列。
让我们更进一步加深我们的例子,说明如下:
Grid控件,命名为Grid1,增加到VB前端设计。
当Light1为红色时按下任何Grid1的键,接着点击NewTruck按钮,显示一个照相机图片。到Light1变为绿色时再隐藏该图片。
很显然,这个行为描述了另一个输入事件序列,它用状态图来描述很方便。这种行为与前面讨论的活动相互独立,可以用完全独立的状态图表来描述。然而,假设我们希望当Light1为红色,又点击了NewCar两次时照相机图片显示约半秒钟。现在两个扩展状态图设计不是完全独立的,第二个扩展状态图的设计必须判断第一个扩展状态图的状态。
有两个独立控制线程的扩展设计如图3所示。
图3 有两个独立控制线程的扩展设计
图19展示了整个设计的扩展状态图;两个虚线方块,分别标记为Count和Camera,称为线程。每个是一个压缩的子状态图,一个对应计数活动,另一个对应照相机活动。这两个线程相互独立运行。例如,当点击NewCar按钮时,Counter可能从状态c_0变化到状态c_1。这时Camera什么都不做,保持当前状态。或者,当点击了NewTruck按钮,它们可能都发生转换,从c_2到Shoot的状态转换是需要一些依赖关系的,当Counter记录下NewCar的两次点击时,Camera必须改变为Shoot状态(使照相机图片可视)。
到现在为止,你应该领会到我们创建的游戏或者说是交通灯的原型和它的控制软件的意义了。这种事件驱动系统可能会变得很大,很复杂,当用单纯VB代码来描述会变得难以阅读。而且,调试一个类似程度的Basic项目也像一个恶梦,控制流在多个事件过程中跳转。调试这样一个由单纯Basic代码完成的包括并行或部分并行活动的设计非常困难,因为Basic代码是文本的,连续定义的;反之,并行的活动在概念上是会同步发生的。
因此,在WYSIWYG (What You See Is What You Get所见即所得)方式里,第一流的图形化编程工具应支持的一个重要能力是能够在图的本身调试图形化的行为。这种调试能力应具有两个主要特性:
动画,当接受输入事件时,图中的状态能够改变颜色;例如,当NewCar事件发生,c_1状态应变为红色(或闪动,或者其他可视的突出显示方法),被突出显示;反之,c_0状态应变回黑色(它不再是当前状态)。图28展示了交互式状态动画操作。
Break-states,就像VB中的断点,当到达某个特定状态时,我们能够暂停调试任务。
关于扩展状态图
为基于事件的系统建模使用扩展状态图是一个强大并被广泛使用的方法。这个概念是由Dr. David Harel发明的,并在他的论文“扩展状态图,解决复杂系统设计的可视化方法”中详细描述。该论文发表于计算机编程科学(1987)。这篇论文描述了如何扩展传统的状态转换图,增加分层、并行和历史等功能,为复杂交互式系统创造了强大的可视化编程范例,在今天的复杂应用中,复杂交互式系统经常出现。扩展状态图主要适用于通讯、宇宙航空、汽车和制造业、工业自动化等广泛领域,并且快速发展为这些工业的状态"De Facto"标准。扩展状态图也是大多现代对象的标准组成部分,如面向对象方法论中的对象建模技术(OMT)和统一建模语言(UML)。
上一篇: 在VB中取得Windows的当前目录
下一篇: VB的“问”与“答”
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:VB5三十六计
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