我们在做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 |
以上就是在CATVBA中使用延时的四种方法,老铁你学废了吗?