【VB开源代码栏目提醒】:以下是网学会员为您推荐的VB开源代码-转载 VB 响应中断程序 - 技术总结,希望本篇文章对您学习有所帮助。
转载
VB 响应中断程序 原文地址
VB响应中断程序作者chengxingcheng21
VB DoEvents介绍2158借用许多介绍DoEvents的文章DoEvents就是转让控制权以便让操作
系统处理其它的事件。
但是当看到这句话时脑子里面的概念很模糊只有一个浅薄的认识。
查阅了一些资料有了一定的了解。
打个比方如果现在有一个从1到100000000的循环有一点编程常识的人肯定知道在这个耗时较长的循环过程中基本上是不能进行别的操作当然不排除一些特别的情况但是因为某些特别的要求你要在循环过程中进行其他操作这时DoEvents就派上用场了。
现在大家应该明白了DoEvents的主要功能了吧。
下面举一些实例基本上都是转载的当然建议自己能亲自去试验理解会深一些。
注后面的
代码表示如果在该处用了这个语句以下
代码中用到了一些api函数请用
vb附带的api浏览器查阅转载一.基本用法1.窗体启动时如果要处理的事务太多或者用sleep函数暂停造成其很久都不能出现时怎么办例如
代码Private Sub Form_LoadShowDoEvents Sleep 5000 End Sub通常容易想到在sleep前加个show但还是不能达到预想的效果窗体虽然出来了但好象只达到了一半如果加上第3句将看到效果大不相同2.如果有个很耗时的循环导致程序不响应怎么办例如Dim LAs Long For L1 To 1000000DoEvents Next L如果无在循环过程中程序无法处理事件对于用户来说是不响应无法控制的3.想在循环中看到处理过程同样Dim LAs Long For L1 To 10000DoEvents Text1.TextCstrlNext L无时将无法看到text1中的变化而只在循环结束时看到最后结果4.怎样中止循环如果有Private Sub Command3_ClickDim LAs Long Do LL1 Debug.Print LDoEvents Loop End Sub会发现当关闭窗口后debug中的数据仍然在变化说明并没结束需要如下Dim IsExit As Boolean Private Sub Command1_ClickDim LAs Long IsExitFalse Do While DoEvents If IsExitTrue Then Exit Do LL1 Loop End Sub Private Sub Command2_Click或者在form_unload模块中等等IsExitTrue End Sub其中isexit是全局变量有些人喜欢用end语句来结束程序小程序固然可以但当太大或者调用了某些特殊的api函数后可能导致预想不到的错误如果装载了许多东西在程序结束时不处理将卸载很慢而且这种做法也极不符合正规
软件的要求.总之end语句毛病很多此不详谈建议少使用甚至不使用二.其基本用法大概就这些现在解析其中的一些难点1.为什么还是不能结束
代码如下Dim IsExit As Boolean Private Sub Command1_ClickDim LAs Long IsExitFalse Do If IsExitTrue Then Exit Do句0 DoEvents句1 Text1.TextCStrL句2 LL1 Loop End Sub Private Sub Form_LoadStatic NAs Long NN1 MsgBox NEnd Sub Private Sub Form_UnloadCancel As IntegerIsExitTrue End Sub运行结果启动时msg显示1点击command1text1在变化此时再点form右上角的小差关闭窗体发现
vb运行控制上的按扭并没变化说明程序还在运行.如果编译成程序后运行按下ctrldelalt也可发现它还没结束.通过读
代码并没发现错误怎么回事关键在于句2访问了控件的属性
代码运行路径当在doevents时程序释放控制权可以接收事件消息form-unload事件只能从此处产生假设此时关闭formunload事件发生即doevents后就运行unload
代码得到isexitt并且form卸载
代码返回到doevents之后运行句2.注意现在form已经卸载了text1从哪里来呢于是form重新装载
代码跳到form_load模块运行所以在关闭窗体后可以看到msg显示2此模块运行完后再继续句2后面的
代码当下次循环遇到句0时退出循环另既然退出了循环怎么还不能结束
vb程序规定其实其他的windows语言一样窗体卸载时并不是立即卸载其模块
代码而只先卸载窗体中的控件和一些属性值
程序中最后一个窗体卸载时才完全卸载.在这个单窗体程序中form卸载时因为循环的控制无法卸载
代码失去了卸载
代码的机会导致再也不能卸载因为没卸载
代码所以运行的句2是并不会出错另既然再次运行了form_load
代码怎么看不见窗体因为程序启动时窗体的到显示的消息而只运行此模块并没有如果在msgbox n语句前加上show就可以看到它了如何解决通过以上分析应该很简单把句1和句2调换一下就可以了关键仔细分析
代码是如何运行的避免在form已经卸载了情况下访问控件2.用了doevents速度太慢了怎么办doevents的代价是速度变慢但要程序响应又不得不用其实doevents语句允许任何应用程序执行相关事件而不仅仅是你自己的程序所以变得很慢.可以让它响应本程序事件动作需要用到api函数GetInputState例如用If GetInputStateThen DoEvents来代替doevents可使循环运行更快3.既要同时响应事件又要控件不变化怎么办例如在一个长的循环中向listview控件中添加记录无doevents时程序无响应但有它时控件又闪的厉害解决办法a.不一定每次循环都doevents可以在适当时间时才用至少没那么闪b.应用api函数ValidateRect功能是使指定的矩型区域生效通知Windows不对指定的区域进行重画另InvalidateRect功能相反同时需要用到函数GetClientRect取得指定对象的矩形区域应用rect函数指定listview的矩形区不重画即可避免闪烁但还是要注意恢复重画否则看不见了真实效果4.控时循环和变速齿轮请看下面的
代码Option Explicit Private Declare Function timeGetTime Libwinmm.dllAs Long Dim IsExit As Boolean Private Sub Command1_ClickDim LAs Long Dim Kt As Long IsExitFalse Do KttimeGetTimedo something LL1 Text1.TextLDoEvents句1 While timeGetTime-Kt 50句2While AbstimeGetTime-Kt50句3While AbstimeGetTime-KtAndNot IsExit50句4 DoEvents句5 WendDoEvents句6 If IsExit Then Exit Do Loop End Sub Private Sub Form_UnloadCancel As IntegerIsExitTrue End Sub其中可用的
代码除去加号的
代码就是通常的控时循环
代码运行
代码并不会出现错误但在循环过程请开启变速齿轮看看当关闭齿轮时将发现text1.text停止了别慌等一段时间它又会继续这要看你设定的时间这里是50毫秒如果设定的太长text1.text将半天都没变化这是怎么回事变速齿轮在启动时将hook.dll映射到你的程序地址运行更改了timegettime函数获取的时间如果在句2和句3间插入debug.print timegettimetimegettime-kt将发现在关闭齿轮的瞬间后者变成了负值timegettime变小了所以才造成需要等很久如果是编写游戏而用户开了齿轮那可就惨了解决方案a.用句3代替句2这个方法最简便虽然不符实但不会出问题建议使用b.不要句5换用句6这样就能达到效果吗因为齿轮还是从doevents语句运行时才能插的进来所以只要kttimegettime和timegettime之间没有doevents就不会出错ab.两种方法都有些小问题但无大碍有兴趣者请自己分析5.程序怎么死了这只是一些人编写时没注意到的小
问题提醒一下同样用上面的
代码如果设定的时间太短以至在
代码运行到句2时已经超时了句5将不能运行了当然程序就死了哦以防万一加上句1所以此时也只能用a
方案来解决齿轮的问题了有必要用句4代替句3吗除非你设定的时间太长人家想关闭你的程序要等上好半天 七乐无穷尽在新浪新版博客快来体验啊请点击进入