来源:CATIA小蚂蚁
我们在做CATIA 二次开发的时候,有的情况下需要暂停程序运行,让CATIA飞一会。
那么,CATIA VBA 获取延时较为可行的四个方法:
1、一般延时 Timer函数(计时单位为秒级,1代表1s)
一个应用接口需要限制运行速度,需要在循环中加个延时函数,这个延时不需要多么精确,要求有个几秒延时,网上用的比较多的就是用Timer函数编写,也是在VB联机手册中所推荐的Timer是VBA自带的函数,用起来比较方便,一般程序如下:
Sub delay(T As Single)
Dim time1 As Single
time1 = Timer
Do While Timer – time1 < T
DoEvents '转让控制权,以便让操作系统处理其它的事件
Loop
Debug.Print ("运行结束,总计耗时为:" & Timer – time1 & "s")
End Sub
Sub calculate1_time()
delay (1.5)
End Sub
2、精确延时–sleep函数(计时单位为毫秒级,1000代表1s)
精确延时可以用sleep函数,sleep函数是Windows API函数,使用前必须声明,然后使用:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
延时-Sleep函数,主要功能就是使当前线程等待?段时间,?法就是“Sleep 毫秒数”,这?的毫秒数可以设置成任意整型数据。如Sleep 1000,表?延时1秒(1000毫秒)。Sleep与DoEvents之间是有点区别的。DoEvents其实是将CPU的控制权交出去,是为了在长循环中进程占据全部CPU资源,也就是相当于?种事件,?上有这样的说法:DoEvents就是把机会让给别的事件,??暂时休息?下,但是占着的位置不会空出来。在死循环?放个DoEvents,CPU占?率是100%,同时这个进程还是可以做别的事情的。?Sleep前?也讲过了,就是使当前线程等待?段时间的,英?单词表?上理解也可以理解成“睡觉”的意思,也就是什么都不做了,也不会占着CPU资源的,当然进程也是什么事都不?的,也就是将程序挂起,使操作系统暂时不会响应任何用户操作.一般程序如下:
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub calculate2_time()
Dim d As Date
d = Time()
Sleep 3000 '延时3秒
Debug.Print ("运行结束,总计耗时" & DateDiff("s", d, Time()) & "s")
End Sub
3、精确延时–timeGetTime函数(这里和上面的sleep一样需要声明,计时单位为毫秒级,1000代表1s)
更好的办法是使用timeGetTime函数,timeGetTime函数返回的是开机到现在的毫秒数,可以支持1毫秒的间隔时间,而且永远增加,不存在回头的问题。当然不是永远不回头,毕竟Long型变量(双字,4字节)也是有取值范围的,这个值在0到2^32之间。大约49.71天。
同sleep函数一样,timeGetTime函数是Windows API函数,使用前必须先声明,即:
Private Declare Function timeGetTime Lib "winmm.dll" () As Long
延时函数和方法1一样,只是将Timer函数换成timeGetTime:
注意:延时时间单位是毫秒。由于延时函数中使用了 DoEvents语句交出了系统控制权,所以不会影响用户的其它操作。
Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
Sub delay(T As Long)
Dim time1 As Long
time1 = timeGetTime
Do
DoEvents '转让控制权,以便让操作系统处理其它的事件
Loop While timeGetTime – time1 < T
End Sub
Sub ce_time()
Dim d As Date
d = Time()
Call delay(1000) '调用函数 可以使用call,也可以不使用
Debug.Print ("运行结束,总计耗时为:" & DateDiff("s", d, Time()) & "s")
End Sub
4,一种巧妙的用法,使用vba自带dateadd 函数(计时单位是秒级,1代表1s)
函数表达式是:DateAdd(interval, number, date)
Public Sub BKWait(HowManySecs)
'pause for HowManySecs seconds
Dim EndWait
EndWait = DateAdd("s", HowManySecs, Now)
While Now < EndWait
'this is dummy text…nothing is actually done during the wait
Wend
End Sub
Sub calculate4()
BKWait (5)
End Sub
