子璉 的个人资料鄭子璉照片日志列表更多 ![]() | 帮助 |
|
2007/3/7 VB6/VBNET CPU 資源釋出我以為我已經寫過這個主題了說... 結果居然找沒有。
在各 Windows 程式下其實都有這個需求,這邊只討論 VB 。
這個資源釋出,通常在大量的長時間回圈計算或等待時,特別需要。使用的時機主要可分成需要精準計時或是可有誤差的計時。
Windows 是多程序、多緒的程式,若某個執行緒霸占著 CPU 不放出來,在 Win9x 是採用非強制多工,所以會導致整個系統停止回應,在 WinNT (NT/2k/XP/2003/Vista) 是採用強制多工,所以會導致系統雖然仍然能跑,但是反應較緩慢,此外,CPU 也處於滿載運作中。
超緒或多核心由於會保留 1 個 CPU 來執行作業系統,所以可能 CPU 負載為 50% 而非 100% (指兩顆 CPU 的狀態)。
VB為了減少使用者的困擾,所以 VB 提供了 DoEvents/Application.DoEvents 來讓 CPU 暫時讓出執行其他程式,或是其他狀態更新,但是即使使用了這個指令,CPU 使用率並不會降低,而仍然處於滿載,若要減緩這個狀況,且不在一些微的時間損失時,可在 DoEvents 完後,呼叫 API Sleep/System.Threading.Thread.Sleep 。
那麼呼叫 Sleep 時要睡多久呢?這看你的需求,一般來說是 0 ~ 500 ms 。
若你的程式要減少最小損耗時,可以睡 0 ms ,這樣並不能降低 CPU 使用率很多,若在 ASP.NET 下,則只有這種方法來放出 CPU 資源,而解決沒有 Application.DoEvents 的困擾。
我建議預設是睡 1 ms,當你睡超過 0 ms 時,CPU 才會真的被釋放出來,睡眠的間距受 GetTickCount 影響解析度,目前在 WinNT 上為 10 ms,在 Win9x 上為 54 ms,換句話說,在 WinNT 上即使睡 1 ms,也會睡到下個 10 ms 間隔,也就是說有可能睡 1 ~ 10 ms ,這樣可以確保執行緒睡眠時間最短,在效能與反應中間取得最佳的平衡,未來若 Windows 改版,造成間隔時間縮短時,也可以用最小時間睡眠。
長時間睡眠,通常是屬於長時間等待,並允許較大的時間誤差,但是睡太久,程式本身自己也不回應任何事件,反而會讓人誤會程式當掉了,所以一般來說,每次睡眠最好別超過 500 ms,若要超過 500 ms ,最好改用 API WaitForSingleObject 來等待,這樣也能立即回應事件。
因此最好自行包裝 DoEvents 來使用:
VBNET:
Public Sub MyDoEvents(Optional ByVal dwMilliseconds As Integer = 1) Application.DoEvents() System.Threading.Thread.Sleep(dwMilliseconds) End Sub 评论 (8)
引用通告此日志的引用通告 URL 是: http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1640.trak 引用此项的网络日志
|
|
|