dim i as long
do
if a=1 then
'做你的事
exit do
end if
i = i + 1
if i >9999999 then '这个99999数字越大,等待时间越长,但具体时间和电脑的CPU性能有关。设置这个数的最大值就是i这个变量类型的最大值,可以把负数部分也利用来计数,这样32位的数字长度应该足够了
eixt sub '跳出sub过程
end if
doevents '防止程序假死
loop
这个做法简单,但是比较占用CPU,等待时间也不能确定,如果可以等待的时间太长就不合适了。
最好的做法,是看你的a=1这个过程是怎么获得的,在这个地方设置事件触发。比如,a=1是通过文本框获得的,就用文本框的text changed事件。如果是串口获得的,就用串口的接收事件。
如果确实没有事件可触发,就用Timer控件,定时去检测,每检测一次就计数加1,当计数超过你设定的值就认为超时。这个做法的缺点就是,如果timer检测间隙太密集,那效果和上面我说的循环一样,占用CPU,如果检测不够密集,那么实时性就差一点。不过Tmer控件可以精确计算等待时间。
延时的时候还要做其他事,纯VB下只有Timer控件可以帮你实现。否则就是多线程编程,需要靠API。那个gettickcount函数的参考 http://baike.baidu.com/view/1485502.htm
'实现: 等待Shell启动的程序运行结束'输入: 由Shell语句返回的任务 ID
'说明: 1、缺省情况下,Shell是以异步方式(并行)来执行其它程序的,即用 Shell 启动的
' 程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
' 本函数让用Shell启动的程序同步运行(串行)
' 2、等待该程序运行结束后才继续执行以后的语句。
'示例: Label1.Caption = "Shell Wait ......"
' ShellWait Shell("fluent.exe", vbNormalFocus)
' Label1.Caption = "Process Finished!"
' 只有你关闭了fluent以后才会运行以后的语句。
=============以下是代码==========
'等待Shell启动的程序运行结束
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Sub ShellWait(iTask As Long)
Dim ret As Long, pHandle As Long
pHandle = OpenProcess(&H100000, False, iTask): ret = WaitForSingleObject(pHandle, -1&): ret = CloseHandle(pHandle)
End Sub
可以用Label控件来做,比如在你那段代码运行前:Label1.Caption = "正在运行,请等待……"
运行结束后:
Label1.Caption = ""
也可以用带有“等待”意思的图片来表示,比如运行前:
Image1.Visible = True
运行结束后:
Image1.Visible = False
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)