魚骨頭的雲端圖書館's Archiver

mhfo 發表於 2013-3-15 13:32

[VB6] 使用DoEvents時,降低CPU Loading的方法

當一個程序的代碼需要花很長的時間去執行,比如處理一筆大資料庫時,這時你需要運用DoEvents函數。DoEvents函數可以臨時返回控制器給操作系統,並允許它去觸發其他的事件。
資料出處:[url]http://msdn.microsoft.com/zh-tw/library/bd65th41[/url](VS.80).aspx
一直苦惱著自己開發的程式Process CPU Loading太大,上網查了一下才知道原來是DoEvents這個函數造成。DoEvents並非天下無敵,用了多了會增加負載、影響效率;雖然 DoEvents 雖然會允許VB6進行其他程序作業,但是不會把CPU資源放出來,故透過呼叫 Sleep 讓 CPU 資源得以釋出,不致以 100% 來占用系統。


經小弟測試的結果果然是降低了CPU的Loading,各位可以自己測測看!

VB6:使用DoEvents




Private Sub Command1_Click() Sub Command1_Click()
   For a = 1 To 100000
       For b = 1 To 100000
            c = c + 1
            Me.Text1.Text = c
            Me.Label1.Caption = c
            DoEvents’將cpu交付給其它程式執行
        Next
    Next
End Sub
由下圖得知,DoEventsTest.exe一下子就飆到99%了






Public Declare Sub Sleep Lib "kernel32" () Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Function MyDoEvents() Function MyDoEvents(Optional ByVal dwMilliseconds As Long = 1)
   MyDoEvents = DoEvents()
   Sleep dwMilliseconds
End Function

用myDoEvents的確讓人興奮,99%變0%了,但別忘了它有sleep,run的速度是會比DoEvents慢很多的喔,自行拿捏吧,sleep的單位秒數是ms,所以sleep 1就是休息0.01 Sec[檢視圖片]

使用.Net Framework :Application.DoEvents( ) - 將cpu交付給其它應用式

+

使用.Net Framework :System.Threading.Thread.Sleep - 降低cpu loading


名稱 說明 Thread.Sleep (Int32) 在指定的時間內暫止目前的執行緒。
受 .NET Compact Framework 支援。
Thread.Sleep (TimeSpan) 封鎖目前執行緒一段指定的時間。
VB.NET:
Public Class Form1

    Private Sub Button1_Click() Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For i As Integer = 0 To 10000
          Me.ListBox1.Items.Add(i.ToString)
          My.Application.DoEvents()
          System.Threading.Thread.Sleep(1)
        Next
    End Sub
End Class




使用.Net Framework :System.Threading.Thread( ) - 多執行緒

多執行緒與DoEvents的定義不同,故不在此篇討論中。

頁: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.