作者:iamlaosong
1、一般延时
一个应用接口需要限制运行速度,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用Timer函数编写,Timer是VBA自带的函数,用起来比较方便,一般程序如下:
'延时程序
Sub delay(T As Single)
Dim time1 As Single
time1 = Timer
Do
DoEvents
Loop While Timer - time1 < T
End Sub
虽然一般用这个函数延迟用秒做单位,但1秒以内的延时也是可以的,老一点的机器时钟中断为每秒18.2次,就是说时间间隔在0.055秒(55毫秒)左右,现在的机器一般都比这个高,具体多少需要测试。Timer函数根据时钟中断记录当天的时间序列值,以秒为单位,也就是从当天0点开始到当前时间点上所经历的秒数(含小数)。当从23:59分钟跨越到0点是,Timer函数的时间也重新归零开始计算。通过查看函数中的timer值得变化情况,可以确定时钟中断的间隔。例如本人的机器timer值变化如下:
56742.09
56742.11
56742.13
56742.14
56742.16
56742.16
56742.17
56742.19
56742.2
56742.22
56742.23
可以看出,时间间隔在10-20毫秒之间(精确显示实际精度是0.015625秒,15.625毫秒)。如果时延在1秒以内,精度要求不高,就可以用这个方法,如:
delay(0.25)
由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。
上面方法虽然简单,但是有一个致命的缺陷,就是Timer函数的时间每天都是从0开始,如果从23:59:59开始延时1秒以上的话,这个延时程序将永远执行下去,下面的延时程序将弥补这个缺陷:
'延时程序
Sub delay(T As Single)
Dim time1, time2 As Single
time1 = Timer
Do
DoEvents
time2 = Timer - time1
If time2 < 0 Then time2 = time2 + 86400 '86400=24*3600
Loop While time2 < T
End Sub
2、精确延时
精确延时可以使用sleep函数,sleep函数是Windows API函数,使用前必须先声明,然后使用,例如:
private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
。。。
sleep 1000 '延时1秒
。。。
sleep函数延时是毫秒级的,精确度比较高,但它在延时时会将程序挂起,使操作系统暂时无法响应用户操作,所以在长延时的时候不适合使用它。
更好的办法是使用timeGetTime函数,timeGetTime函数返回的是开机到现在的毫秒数,可以支持1毫秒的间隔时间,而且永远增加,不存在回头的问题。当然不是永远不回头,毕竟Long型变量(双字,4字节)也是有取值范围的,这个值在0到2^32之间。大约49.71天。
同sleep函数一样,timeGetTime函数是Windows API函数,使用前必须先声明,即:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
延时函数和上面的一样,只是将Timer函数换成timeGetTime:
'精确延时程序
Sub delay(T As Long)
Dim time1 As Long
time1 = timeGetTime
Do
DoEvents
Loop While timeGetTime - time1 < T
End Sub
注意:延时时间单位是毫秒。由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。