【CATIA二次開(kāi)發(fā)】CATVBA中四個(gè)延時(shí)方法Timer函數(shù),Sleep函數(shù),TimeGettime函數(shù),Adddate函數(shù)

我們?cè)谧鯟ATIA 二次開(kāi)發(fā)的時(shí)候,有的情況下需要暫停程序運(yùn)行,讓CATIA飛一會(huì)。

那么,CATIA VBA 獲取延時(shí)較為可行的四個(gè)方法:

1、一般延時(shí) Timer函數(shù)(計(jì)時(shí)單位為秒級(jí),1代表1s

一個(gè)應(yīng)用接口需要限制運(yùn)行速度,需要在循環(huán)中加個(gè)延時(shí)函數(shù),這個(gè)延時(shí)不需要多么精確,要求有個(gè)幾秒延時(shí),網(wǎng)上用的比較多的就是用Timer函數(shù)編寫(xiě),也是在VB聯(lián)機(jī)手冊(cè)中所推薦的Timer是VBA自帶的函數(shù),用起來(lái)比較方便,一般程序如下:

Sub delay(T As Single)

    Dim time1 As Single

    time1 = Timer

    Do While Timer - time1 < T

        DoEvents '轉(zhuǎn)讓控制權(quán),以便讓操作系統(tǒng)處理其它的事件

    Loop

    Debug.Print ("運(yùn)行結(jié)束,總計(jì)耗時(shí)為:" & Timer - time1 & "s")

End Sub


Sub calculate1_time()

    delay (1.5)

End Sub



2、精確延時(shí)--sleep函數(shù)(計(jì)時(shí)單位為毫秒級(jí),1000代表1s)

精確延時(shí)可以用sleep函數(shù),sleep函數(shù)是Windows API函數(shù),使用前必須聲明,然后使用:

Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

延時(shí)-Sleep函數(shù),主要功能就是使當(dāng)前線程等待?段時(shí)間,?法就是“Sleep 毫秒數(shù)”,這?的毫秒數(shù)可以設(shè)置成任意整型數(shù)據(jù)。如Sleep 1000,表?延時(shí)1秒(1000毫秒)。Sleep與DoEvents之間是有點(diǎn)區(qū)別的。DoEvents其實(shí)是將CPU的控制權(quán)交出去,是為了在長(zhǎng)循環(huán)中進(jìn)程占據(jù)全部CPU資源,也就是相當(dāng)于?種事件,?上有這樣的說(shuō)法:DoEvents就是把機(jī)會(huì)讓給別的事件,??暫時(shí)休息?下,但是占著的位置不會(huì)空出來(lái)。在死循環(huán)?放個(gè)DoEvents,CPU占?率是100%,同時(shí)這個(gè)進(jìn)程還是可以做別的事情的。?Sleep前?也講過(guò)了,就是使當(dāng)前線程等待?段時(shí)間的,英?單詞表?上理解也可以理解成“睡覺(jué)”的意思,也就是什么都不做了,也不會(huì)占著CPU資源的,當(dāng)然進(jìn)程也是什么事都不?的,也就是將程序掛起,使操作系統(tǒng)暫時(shí)不會(huì)響應(yīng)任何用戶操作.一般程序如下:


Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub calculate2_time()

    Dim d As Date

    d = Time()

    Sleep 3000 '延時(shí)3秒

    Debug.Print ("運(yùn)行結(jié)束,總計(jì)耗時(shí)" & DateDiff("s", d, Time()) & "s")

End Sub


3、精確延時(shí)--timeGetTime函數(shù)(這里和上面的sleep一樣需要聲明,計(jì)時(shí)單位為毫秒級(jí),1000代表1s)

更好的辦法是使用timeGetTime函數(shù),timeGetTime函數(shù)返回的是開(kāi)機(jī)到現(xiàn)在的毫秒數(shù),可以支持1毫秒的間隔時(shí)間,而且永遠(yuǎn)增加,不存在回頭的問(wèn)題。當(dāng)然不是永遠(yuǎn)不回頭,畢竟Long型變量(雙字,4字節(jié))也是有取值范圍的,這個(gè)值在0到2^32之間。大約49.71天。

同sleep函數(shù)一樣,timeGetTime函數(shù)是Windows API函數(shù),使用前必須先聲明,即:

Private Declare Function timeGetTime Lib "winmm.dll" () As Long

延時(shí)函數(shù)和方法1一樣,只是將Timer函數(shù)換成timeGetTime:

注意:延時(shí)時(shí)間單位是毫秒。由于延時(shí)函數(shù)中使用了 DoEvents語(yǔ)句交出了系統(tǒng)控制權(quán),所以不會(huì)影響用戶的其它操作。


Private Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long

Sub delay(T As Long)

    Dim time1 As Long

    time1 = timeGetTime

    Do

        DoEvents  '轉(zhuǎn)讓控制權(quán),以便讓操作系統(tǒng)處理其它的事件

    Loop While timeGetTime - time1 < T

End Sub

Sub ce_time()

    Dim d As Date

    d = Time()

    Call delay(1000)  '調(diào)用函數(shù) 可以使用call,也可以不使用

    Debug.Print ("運(yùn)行結(jié)束,總計(jì)耗時(shí)為:" & DateDiff("s", d, Time()) & "s")

End Sub


4,一種巧妙的用法,使用vba自帶dateadd 函數(shù)(計(jì)時(shí)單位是秒級(jí),1代表1s)

函數(shù)表達(dá)式是: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中使用延時(shí)的四種方法,老鐵你學(xué)廢了嗎?


文章來(lái)源CATIA小螞蟻    


登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP