Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Function Delay(DT As Long)
For i = 0 To DT Step 2
DoEvents '操作權交給系統 否則程式會暫時無回應
Sleep 1
Next i
End Function
==============
寫以上程式的作者在主程式中還有這么一段注釋。
Delay 2000
End '延時兩秒后程式自動結束
================
我的第一個疑問是 Step 2 的情況下Delay 2000難道不是只延遲一秒嗎?
奇怪的是,當我運行時作者卻是對的。
這難道還跟平臺有關,我用的是個VB 6迷你版的。
第二個問題就很奇葩了:我前兩天用Delay 60000 來延遲一分鐘,生成了.exe正常運行。 然后今天還用這個exe時變成了延遲9分鐘10分鐘的樣子。我自己的機器沒有人修改過這個exe
uj5u.com熱心網友回復:
什么情況下要延時1分鐘?uj5u.com熱心網友回復:
我沒看出:作者“對”在哪里。并且我實際測驗結果也明顯不支持樓主的說法。
按我的測驗,Delay 2000的結果是15秒多時間,
如果 Delay 60000的話,算下來超過936秒,也就是超過15分鐘半以上(沒有實際運行,按測驗結果計算的),
并不是樓主所說的9、10分鐘的樣子。
別跟我說是“機子”或“系統”問題,我在兩臺主機上運行過 .exe ,結果沒什么差別:
一臺是 WinXP,DELL主機,3.2G雙核(E5800);
另一臺是Win7專業版32位,聯想主機,3.0G雙核(G3220)。
我在IDE下運行,和編譯成 .exe運行,結果一樣(WinXP這臺)。
以前論壇中就有一個帖子討論過這些“時間精度”的問題,Sleep的“精度”根本就達不到1ms的級別,只有10多ms。
建議樓主查找一下。
我的測驗代碼如下:
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Function Delay(DT As Long)
Dim i As Long
For i = 0 To DT Step 2
DoEvents '操作權交給系統 否則程式會暫時無回應
Sleep 1
Next
End Function
Private Sub Command1_Click()
Dim t1!, t2!
Dim lDT As Long
Me.Cls
Print "2秒測驗:"
lDT = 2000 ' 延時2秒?
t1 = Timer() ' 開始時間
Call Delay(lDT)
t2 = Timer() ' 延時結束時間
Print t1
Print t2
Print "實際延時:" & Format$(t2 - t1, "0.00秒")
Print "平均周期:" & Format$((t2 - t1) / (lDT / 2 + 1), "0.0000")
Me.Print vbCrLf & "1秒測驗:"
lDT = 1000 ' 延時1秒?
t1 = Timer() ' 開始時間
Call Delay(lDT)
t2 = Timer() ' 延時結束時間
Print t1
Print t2
Print "實際延時:" & Format$(t2 - t1, "0.00秒")
Print "平均周期:" & Format$((t2 - t1) / (lDT / 2 + 1), "0.0000")
Me.Print vbCrLf & "0.1秒測驗:"
lDT = 100 ' 延時0.1秒?
t1 = Timer() ' 開始時間
Call Delay(lDT)
t2 = Timer() ' 延時結束時間
Print t1
Print t2
Print "實際延時:" & Format$(t2 - t1, "0.00秒")
Print "平均周期:" & Format$((t2 - t1) / (lDT / 2 + 1), "0.0000")
End Sub
uj5u.com熱心網友回復:
本想插入一張運行結果的圖片,但總是不成功。(不知道是IE問題,還是公司的網路訪問限制造成的)
用文字大致說一下:
Delay 2000,理論上應該是2秒,測驗結果是15.64
Delay 1000,理論上應該是1秒,測驗結果是7.83
Delay 100,理論上是0.1秒,測驗結果是0.80秒
注意我是簡單的用Timer函式獲取系統時間,這個的“理論精度”才0.01秒,精度比較低的。
因此上面的結果“倍數比例”有明顯差異,也是正常的。
代碼中計算的“平均周期”就是 Delay( ) 函式中每次 For回圈的執行周期,
這個時間主要在 Sleep 1 那兒,理論上應該是1ms(或者說按作者 Step 2 ,應該是2ms),
但我的測驗結果,基本上是15.63ms 。
可見這個差距是非常之大的!!!
uj5u.com熱心網友回復:
換句話說,如果要“比較精確”的進行延時,用 Sleep來計次回圈,根本就是“不靠譜”!!!如果要延時做得比較準確,必須是進入“延時”時獲取當前時間(起點)、然后Do回圈/ Sleep / DoEvents
在Do回圈中再不停的獲取“當前時間”,計算與起點的時間差,當大于等于延時,就跳出Do回圈,延時結束回傳。
這樣才可以比較準確的延時,“延時精度”取決于獲取“時間”的精度,
具體用什么方式,就看實際需求了。
uj5u.com熱心網友回復:
謝謝,sleep的“精度”我知道不靠譜了,但那個Delay函式還是不太懂。Public Function Delay(DT As Long)
For i = 0 To DT Step 2
DoEvents '操作權交給系統 否則程式會暫時無回應
Sleep 1
Next i
End Function
假設sleep是標準的1ms,在step為2的情況下,Delay 2000,理論上是1秒吧。
uj5u.com熱心網友回復:
很明顯,你代碼中回圈呼叫的DoEvents 這一句,他所需要的時間是不確定的啊,而你竟然還說,"Delay 2000,理論上是1秒吧",荒唐:)
uj5u.com熱心網友回復:
Private Function Delay(DT As Long)Dim i As Long
For i = 0 To DT Step 2
DoEvents '操作權交給系統 否則程式會暫時無回應
Sleep 1
Next
End Function
這類的延時方法是非常不準確的!會受機器硬體、運行環境、運行的執行緒等因素影響
Private Function Delay(DT As Long)
Dim t0 As Long
t0=GetTickcount()
do while 1
if gettickcount-t0>dt then exit do
DoEvents '操作權交給系統 否則程式會暫時無回應
Sleep 1
loop
End Function
uj5u.com熱心網友回復:
Windows延時精度≈15ms轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/101083.html
標籤:VB基礎類
上一篇:大神求原始碼
