说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB如何在Visual Basic中实现异步执行程序

HTML文档下载 WORD文档下载 PDF文档下载
VB如何在Visual Basic中实现异步执行程序
郑州市金博大商务中心B座
郭继胜
---- 使用 Visual Basic 编写应用程序的开发人员一定都遇到过这样的情形:当你的应用程序要完成一个比较大的任务时,并且该任务是那种“独占式”的任务(比如:使用 Visual Basic 的函数 FileCopy 复制一个超过50兆字节的文件),如果不对程序作出特殊的处理,则用户将被迫面对一个象是被“挂起”的窗体,任凭你用鼠标怎样点击也没有任何反应,更糟糕的是当你从屏幕保护程序切换回该程序时会看到程序的窗体变成了一块“白布”,这更加给人一种“死机”的感觉(其实不仅是使用Visual Basic会遇到这种问题,使用其他的开发工具同样会存在,但其各自提供了自己的解决方法,这里我们姑且只讨论Visual Basic,至于其他的开发工具请参考它们的开发文档)。如何避免这种尴尬的界面出现呢?笔者在实践中发现了一种简单的办法,在这里介绍给大家,希望能对您有所帮助。

---- 这种办法是利用 Visual Basic 提供的创建ActiveX 部件的功能设计一个专门完成“大任务”的ActiveX 部件。Visual Basic 从5.0版本开始在创建ActiveX部件方面显示出前所未有的优秀品质。这里对ActiveX部件作如下简单介绍,以期适合不同的读者。Visual Basic所能设计的部件共有两种:一种是可视的部件;另一种是不可视的部件。可视的部件包括ActiveX控件和ActiveX文档,最常见的ActiveX控件比如现今各种高级开发工具(Inprise Delphi,Sybase PowerBuider等)都提供的按纽(Command或Button)、标签(Label)等等,ActiveX控件和窗体一起构成了应用程序与用户交互的界面。ActiveX文档使用在Internet应用程序中。由于我们的问题不涉及到可视的部件,所以这里不再赘述。

---- 不可视的部件又称为代码部件,包括Active DLL部件和ActiveX EXE部件两种。ActiveX部件的另一个名称是ActiveX服务器,之所以被称作服务器是由于ActiveX部件与使用它们的应用程序之间的关系可以被类比为服务器程序与客户端程序之间的关系:ActiveX部件封装了特定的功能或业务规则,应用程序不需要知道ActiveX部件是如何实现这些功能或业务规则的,只需要通过ActiveX部件提供的编程接口(API:Applacation Programming Interface ,ActiveX部件的API是由部件或其类的一系列属性、方法和事件构成的)传递应用程序的要求(通过属性或方法的参数),然后从部件的事件或其类的事件获得执行结果。根据ActiveX部件(ActiveX服务器)的执行方式可以把ActiveX部件分为进程内部件和进程外部件,所谓进程内部件即部件和使用它们的应用程序执行时共享同一个进程;而进程外部件却执行在自己的进程中,也可以这样认为:进程外部件的执行不影响使用它们的应用程序!显然,这个特性正是本文开始面对的那个问题所需要的。在部件中只有ActiveX EXE部件是进程外部件,因此利用这个特性我们可以创建一个ActiveX EXE部件来完成“大任务”,而应用程序窗体只显示一些任务的提示信息,直到ActiveX EXE部件的类的事件提示任务结束为止。这样应用程序就避免了那种呆板的“白布”窗体的出现,而能够响应任何来自用户的操作或者当从那些遮盖住它的程序切换回来时自行刷新。给用户的感觉是程序是在“异步”执行的。(注:关于创建ActiveX部件的详细信息请参考《Visual Basic联机手册》或MSDN文档)

---- 下面我们通过例子来看如何实现这一想法:在这个例子中我们假设应用程序窗体是一个一直显示当前时间的数字时钟,当你使其执行“大任务”直到任务的完成,这期间你会发现数字时钟窗体从来就没有被“挂起”过,仍然能够响应你的拖动操作和不停地显示时间。以下是实现这一程序和ActiveX EXE部件的步骤及源代码(以Visual Basic 6.0中文企业版为例):

---- 一、 创建ActiveX EXE部件(BigJobServer):

---- 步骤一:打开Visual Basic 6.0(或Visual Basic 5.0)新建一个Visual Basic工程,工程类型选择ActiveX EXE,在工程资源管理器中选中工程1,然后在属性窗口中将其名称改为 BigJobServer。

---- 步骤二:为工程添加一个Timer控件的容器窗体(添加窗体通过菜单 工程 >添加窗体 完成)。窗体名称改为 frmClock ;在窗体上放置一个Timer控件(从工具箱中选择Timer控件),名称改为 timClock。

---- 说明:添加该窗体的用意是提供一个执行任务的定时器(Timer控件)

---- 步骤三:设计实现“大任务”的类 BigJob(注:代码部件是通过各种类实现应用程序交给它的任务的,关于类的创建请参考《手册》或MSDN文档)默认情况下当你新建ActiveX EXE部件时Visual Basic为你添加了一个名为Class1的类(要增加类通过菜单 工程>添加类模块 完成),从工程资源管理器中选中Class1,然后在属性窗口中设置如下属性:

---- (名称): BigJob

---- Instancing: 5-MultiUse (可被创建多个实例,详细情况参考《手册》)编写API:为类BigJob添加方法和事件(通过菜单工具 >添加过程完成)部分代码及程序说明如下:

Private frmTimeClock As frmClock '声明定时器容器窗体
Private WithEvents oTimer As Timer '声明定时器(包括其事件)
Public Event JobStart() '声明任务开始事件
Public Event JobEnd() '声明任务结束事件

Private Sub Class_Initialize()
'---- 类初始化事件 ----
'在这里创建定时器窗体 frmTimeClock
'并引用定时器 oTimer
Set frmTimeClock = New frmClock
Load frmTimeClock
Set oTimer = frmTimeClock.timClock
oTimer.Enabled = False
End Sub

Private Sub Class_Terminate()
'类终止事件,释放定时器并卸载定时器窗体
Set oTimer = Nothing
Unload frmTimeClock
End Sub

Public Sub StartJob()
'方法 - 通知执行“大任务”
oTimer.Interval = 100
‘经过0.1秒时间开始执行任务
oTimer.Enabled = True
End Sub

Private Sub doBigJob()
'模拟的“大任务”是这个空耗时间的循环
'显然,这段代码在标准EXE程序中一定会造成“挂起”状态!
Dim lngTemp As Long
Dim lngSum As Long

For lngTemp = 1 To 10000000
lngSum = lngSum + 1
Next
End Sub

Private Sub oTimer_Timer()
'定时器周期到时开始执行任务
oTimer.Enabled = False
RaiseEvent JobStart '触发“开始执行”事件
doBigJob '执行“大任务”
RaiseEvent JobEnd '触发“任务结束”事件
End Sub

---- 现在保存工程:选择菜单 文件>保存工程,根据提示窗口选择合适的文件夹保存所有工程资源(工程文件,窗体文件,类文件)。

---- 二、 使用并调试BigJobServer部件:

---- 步骤一:选择菜单 运行 >全编译执行,可以看到除了Visual Basic进入运行工程 的状态之外看不到任何窗体出现,ActiveX EXE部件的调试比较特殊: 需要在另一个Visual Basic程序中进行。

---- 步骤二:最小化Visual Basic,然后启动另一个Visual Basic的实例,新建一个标 准EXE工程。选择菜单 工程>引用 ,在可引用的部件中我们可以找到 BigJobServer部件,选中该部件,按“确定”按纽返回。这样就建立了 应用程序和部件服务器间的联系。现在可以在这个工程中创建BigJob类 并使用其方法和事件了。

---- 步骤三:在默认的窗体Form1上放置如下控件并设置其属性(方法同前):

类型 名称 标题(Caption属性)
Label lblTime lblTime
Label lblMessage lblMessage
Timer timClock (无)
Command cmdStart 执行任务
步骤四:为该工程编写简单的代码:
Option Explicit
Dim WithEvents myJob As BigJob ‘声明BigJob对象(包括事件)
Private Sub Form_Load()
Set myJob = New BigJob ‘创建BigJob的实例
End Sub

Private Sub Form_Unload(Cancel As Integer)
Set myJob = Nothing '释放对象
End Sub

Private Sub cmdStart_Click()
myJob.StartJob '通知对象执行任务
End Sub

Private Sub myJob_JobStart()
'在对象的“开始”事件中给用户一些提示
lblMessage.Caption = "正在执行任务 ..."
End Sub

Private Sub myJob_JobEnd()
'在对象的“结束”事件中给用户一些提示
lblMessage.Caption = "任务完成!"
End Sub

Private Sub timClock_Timer()
'“数字时钟”在不间断地显示当前时间
lblTime.Caption = Format(Now, "HH:NN:SS")
End Sub

---- 步骤五:保存并运行这个测试工程会看到如下结果:当你按下“执行任务”按纽 后从提示可以知道那个可怕的“大任务”已经开始执行,直到程序提示任 务结束,这期间无论是拖动窗体还是时间的显示均不会受到影响。由此可 见程序被“挂起”的尴尬局面得到了解决。

---- 三、 补充说明:

---- 1、 上述程序在Visual Basic 6.0中文企业版上调试通过。

---- 2、 要在你的程序中实现这种方法,可以改进ActiveX EXE部件。比如在类BigJob中把doBigJob过程替换为你的具体任务;或通过添加属性来传递适当的任务参数等等。

---- 3、 关于ActiveX EXE部件的编译和发布问题,请参考《Visual Basic联机手册》或MSDN文档。
谁主沉浮,亚马逊和思科角力DaaS市场 忆往昔峥嵘岁月稠——看苹果第一代iPhone的“风骚”往事 开源工具链“大牛”的经验分享:HelloGCC 2013精彩演讲回顾 20个超实用的JavaScript技巧及最佳实践 【开源专访】Linux Deepin:做更好用的Linux桌面系统 访Andy Jassy:感受亚马逊AWS生态观,思考国内外云计算差异 站到风口,最先飞起来的能将服务做到极致的IDC 苹果Siri再获一专利:可使用自然语音输入来搜索和标记图片 研发周报:Google抛弃C语言,采用Go语言重写Go编译器 取其精华 IE11里移除和新增的功能 大胆预测亚马逊即将推出的五大产品或服务 移动周报:GitHub章鱼猫中国之行 三星与LG的新动向:同样的物联网 ,不同的玩法 从Twitter到Tinder,看社交媒体在2013年的沉浮 一周消息树:有道周枫和他的“放养”团队、太极助手惹“非议” Netflix:使用大数据驱动商业决策 “中国杯”游戏极限开发大赛报道 回顾2013软件开发:JavaScript领风骚 京东“宙斯杯”创新应用大赛,百万奖金为“你”而等待 12306上的分布式内存数据技术GemFire Canalys:苹果、三星2014年仍统治平板市场 微软压力山大 Google和苹果的下一个战场 回顾2013科技界大事件:Mayer登Vouge杂志、Ballmer离职 《近匠》第03期:移动开发工具访谈,AVOS Cloud——后端的金刚钻 次世代视觉:Avegant Glyph智能眼镜技术解析 技术栈的选择:从Groupon转向Node.js、淘宝去IOE谈起 首席数据官:一个属于你的时代已经来临 盘点2013年Facebook七大最受欢迎的hack 见证中国开源的力量:“开源力量”2013年度庆典活动亮点汇总 专访APU13讲师、西电朱虎明:概念难以理解成异构编程最大阻力 盘点2013:21款最优秀的开源数据库 看看谁会呢 如何用printer对象控制打印? 通过SMS进行文件传输能实现吗? 寻求 Studio .NET 2003 的帮助文档 有谁知道公文管理中归档操作的原理?在线!!! 请问指针如何编写的?在什么控件下进行? kylix3下不了啊? (www.borland.com/products/downloads/download_kylix.html#) vc++中的expression cannot be evaluated是什么错啊,谢谢请看看! vc++.net对串口编程和多线程的支持的如何? 急!有关CListCtrl的滚动条拖动事件!(在线等待) 用delphi编写的应用程序如何随计算机的分辨率而变化 请教两个问题,短信和传真 哪位能帮忙提供一下使用CDO组件发送邮件的实例?最好详细点的 apache做的服务器,用外地用户用域名不能访问,而用ip可以,是怎么回事? [讨论]为什么用Servlet通过访问SessionBean来访问EntityBean, 会比用Servlet直接访问EntityBean要快呢? 请问opener和parent有什么区别? 大虾救命呀~page_load中执行两条sql语句??? 【转载】国内CCIE日增1例,总数近800 以前的我写的j2ee简单实例 jsp + servlet + ejb .需要者请进!!. 要求不高,只要会delphi。在福州。 web方式下的Gis用Mapx控件能否实现? 我想在new一个panel的时候给他装上一个canvas,不知道可不可以? 关于struts配置问题 struts问题(来者有分) exchange2k 邮件服务器只能收不能发,有防为墙,是什么问题?哪位大虾知道,多谢了. 有好的解决办法吗?望各位大虾给予指点!!! 以前的我写的j2ee简单实例 jsp + servlet + ejb .需要者留请进 !!. 有没有人做这种控件 收到一封Borland的信,很搞笑 在jsp页面里怎样在当前目录生成文件并往里写数据? 问一个有关installshield的问题? 导入导出问题,提示权限不够 vb6.0中的form1_resize()事件在.net中如何实现?? 求一个好算法!!!紧急~~~~ SAMETIME SERVER 的设置问题 各位版主:做为一个两星用户,对论坛规则的一些建议,如果有同感,请支持一下,谢谢! 在xp下能访问access数据库,在2000下访问不成,请高手指点!急! EXCHANGE 与 notes 的互通问题? 高手请进,我以前做的3D引擎是用OpenGL写的,我想改成DirectX的,请问有没有好的办法? 在weblogic7.0中jdk是1.3而要使用DataSource是JDK1.4这样不是就要不兼容了吗? 安装问题,急。在线等待! sql server 数据库转换成access数据库? 在线等待,有效马上给100分! ***如何用C#做一个自动增长的表(从另一个页面添加记录)??? 再问Form问题 oracle 能否导入的时候不覆盖原来的数据,插入数据? 求货郎担问题的算法--越快越好 Outlook Express 问题,解决问题100分相赠 请教大家怎样编程实现两个不同局域网内的单机通信? 超难问题:客户端的C++BUILDER程序怎么与服务器端Web Session交互? 求助?!!!为什么利用IIS的SMTP发邮件极少数能够收到?!!程序没有问题!! 先行谢过,asp文件的加密问题。 已知直线y=kx-1与双曲线4x^2-y^2=1,当k为何值时,直线与双曲线 (1)有两个公共点;((2)有一个公共点(3)没有公共点 写出表示“看”的词语(不能重复)上下地看大概地看向远处看向四方看仔细地看偷偷地看恭敬地看暗中查看 我们的房间()宽敞,()明亮.填关联词,需要两组 求经过点(1/2,2)且与双曲线4x^2-y^2=1仅有一个公共点的直线方程 填上表示拿的词语,不能重复1.我饿极了,( )起饭碗就吃了起来.2.小弟弟( )着一个大皮球蹒跚着走过来.3.奶奶( )着篮子去买菜.4.叔叔( )起猎枪对准目标,“砰”的一声射了出去.5.人们 已知正方形ABCD的边长为a,边AB上任意一点P到对角线AC,BD的距离之和为___________? 闻官军收河南河北的意思 要短,要简练 连绵不断的山叫什么(一个字) 用两个像造句急 高等数学中解微分方程时,±e^c为什么可以用C代换?代换之后,明显改变了函数啊,原来等号另一侧双值就变成了单值,函数少了一支啊 填表示"看"的词语.不能重复啊!( )老师 ( )节目 ( )病人 ( )山下 ( )国旗 ( )四周 谁有往届电大英语三试卷代号为1844的题目及答案啊?!明天就要用了!听说可能电大2013年的英语三试卷有用,有这个的大侠麻烦也给我发一份,谢谢!我的q q839394131 抱在一起亲用一个两个字的词语概括是什么、、、 已经知道a、b、c是△ABC的三边长,化简:|a-b-c|+|b-c-a|+|c-a-b|= 本人读电大要书!有的请和我联系管理学基础 ,统计学原理,统计学原理,基础会计,英语I(2),个人理财,在那可以买到! 要求久书1 入射角和反射角有什么关系时听到的声音最响 “抱在一起亲”用一个两个字的词概括,是什么?、、 45立方分米=( )平方分米? 两个公式 关于纠缠不清的词语 词语!词语!看清楚!词语 如图,在三角形ABC中,点O是AC边上一动点(点O与A、C不重合),过点O作直线MN||BC,设MN交角ACB的角平分线与点E,交角BCA的外角平分线与点F.注意,我只问一问:当三角形ABC满足什么条件时,四边形AECF为正 有这两个公式吗 2012年《中级财务会计二》试卷号2608的期末试题上次的问题也一起算 谈谈斯宾诺莎在认识论上的唯理论立场 填上搭配恰当的词语不能重复保持() ()纯朴 优良()维持() ()纯洁 优秀()坚持() 纯熟() 优质()全部答完会有重赏! 一个木和一个扇读什么 “飞流直下三千尺,疑是银河落九天.”这句话中把()比作().同时还运用了()手法. 什么公式,两个的 一个木和一个见和起来怎么读 比喻葛蔓纠结,难于分解,纠缠不清的事情的成语 填上合适且不重复的词语同是一条溪中的水,有人用金杯()它,有人用泥制土杯()它,有人无杯只好用手()喝了. 设有说明语句:int x[4][5];那为什么x[2][5]的引用是错误的? 飞流直下三千尺,疑是银河落九天.采用了什么手法?A.比喻 B.夸张 C.拟人 ___(hope)he can get the first prize in the maths competiion 设int x=17,y=5;.执行语句“x%=x-y”后x的值为?(书中答案为2,求解释) 描写颜色的3字词语(字不重复)例如:葡萄灰 导数左右导问题 A项 怎么判断左右导 1/2√x的积分怎么求 飞流直下三千尺,疑是银河落九天.出自( ),运用了( )的手法是填空 填上合适的词语,不能重复( ) } 温柔 感受( )( )不能填语言温柔,也不能填感受温暖,感受春天 写作业时候脑子胡思乱想怎么办已经持续好长时间了吧,我正处在最重要的高三,写数学的时候写着写着就想到其他东西,大多数是我最近经历的人或事,所以这样数学作业正确率不高,很多算错 工莱布尼茨缓中国儒学的原因历史试题 白噪声序列有什么作用呢? 谁知道下面词的比较级——strong,long,much,often,pretty,big,easy,thin,careful,heavy知道多少写多少,不全也没有关系,我会很感谢你的还有最高级,不好意思刚才忘打了。 关于莱布尼兹微积分的创造者,同时是个哲学家.同时从二进位制中,莱布尼兹发现了上帝创造世界的证据.这是怎么回事?可否介绍下?莱布尼兹是否留下过什么谜? 白噪声发生器的功能 已知:在三角形ABC中,AB=AC,角A=100度,角B的平分线交AC于点E.求证:BC=AE+BE 写成语:他多年的恩怨____(葛蔓纠结,难于分解,比喻纠缠不清的事情)终于烟消云散了写成语:他多年的恩怨_______(葛蔓纠结,难于分解,比喻纠缠不清的事情)终于烟消云散了 闻官军收河南河北原文 句型转换 although he is a child,he knows a lot.child()he is,he knows a lot.我填的是though 用关联词.我们的房间( )宽敞,( )明亮. 在( )里填上合适的词语(词语不重复)著名的( )3个( )地说 3个雄伟的( )3个( )地做 3个 5年级数学下册轻松十五分难题人教版五年级数学下册轻松十五分的难题不会,快乐提升的!【一根长16分米的长方体木料,底面是正方形.把木料锯成三段后,表面积增加了16平方分米.这根木料原 我们的房间( )宽敞,( )明亮,填关联词填上恰当的关联词 四.在( )里填上合适的词语.(不能重复)( )天( )地( )天( )地( )天( )地( )天( )地十二个( )天( )地( )天( )地 填表示看的词语,不能重复 ( )按上吸热玻璃,房间( )凉爽多了.填关联词 已知直线y=kx与双曲线4x^2-y^2=16,当k为何值时,直线与双曲线有(1)两个公共点(2)有一个公共点(1)两个公共点(2)有一个公共点(3)没有公共点答案(1)-2<k<2(2)不存在(3)k≤-2或k 写出表示看的词语.(不能重复)从高处向下看( );前后左右地看( );偷偷摸摸地看( );从低处向上看( );上上下下地看( );专注地看(). 他听音乐.他收拾屋子.填关联词 全球首辆太阳能小轿车在新加坡亮相德国海关发现1500余幅毕加索等大师加涉毒市长为犯错表歉意 但未明确承认日台风灾区一男子称受灾系因禁止大麻而孙燕姿鲁豫户田惠梨香 女星骨瘦如柴太澳男子头部遭枪击送医后仅数小时自行离泰游船沉没已致6人罹难 包括一名中国美国务卿访问埃及 美将与埃过渡政府合农夫山泉派员举报《京华时报》 称实行印度将发射环火星探测器 否认与华“太调查显示常戴有毒银饰或影响孩子智力叙提前完成销毁化武初期任务 美被指进局势动荡民众对政治改革灰心 埃及再现土耳其总统称叙利亚正成为“地中海的阿国家旅游局:明年节假日方案将参考网络学生网上留言校方32个月后回复 网友美国伯明翰机场收到威胁后紧急关闭 已欧盟欲规范产地标签 德国或成“中国制吉星鹏杀人案今庭审 律师解读是否会判多地现混合型日食奇观 盘点全球惊心动斯诺登请求美对其法外施仁 白宫拒绝并有一种美,叫做宫崎骏电影里的夏天。七言|不要把最坏的脾气,留给最亲的人一组刷爆外网的漫画:为什么你的孩子没关于*乳*房*的冷知识,连女人自己都她淡出娱乐圈,山区默默支教9年, 有盘点琼瑶剧最美女星 朱茵才排第10她是性感女神,才华与美貌并重,为了初碾压鞠婧祎、四万年一遇,从苏杉杉的走治理雾霾再放大招!7月5日起德州推广林志颖晒双胞胎儿子,一个像妈妈一个像她曾和苏有朋拍三级片,写真大胆,和应传丰田拟收购谷歌机器人部门BostoNexus设备独享:免费上传原图Google Photos上线一年后Android N取名投票:印度甜点谷歌公布Android Wear 2谷歌:市面上所有Android手机都41 页 PPT 揭秘 Uber 的为什么人越招越多,效率却没有越来越高一位失败的运营者说:微信公众号不是流你到底有没有权利让无人机滚出你家后院
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘