[VB6] [VB.Net][C#.Net] 使用DoEvents時,降低CPU Loading的方法

  • 70185
  • 0
  • VB6
  • 2008-11-16

摘要:[VB6] [VB.Net][C#.Net] 使用DoEvents時,降低CPU Loading的方法

當一個程序的代碼需要花很長的時間去執行,比如處理一筆大資料庫時,這時你需要運用DoEvents函數。DoEvents函數可以臨時返回控制器給操作系統,並允許它去觸發其他的事件。

資料出處:http://msdn.microsoft.com/zh-tw/library/bd65th41(VS.80).aspx

一直苦惱著自己開發的程式Process CPU Loading太大,上網查了一下才知道原來是DoEvents這個函數造成DoEvents並非天下無敵,用了多了會增加負載、影響效率;雖然 DoEvents 雖然會允許VB6進行其他程序作業,但是不會把CPU資源放出來,故透過呼叫 Sleep CPU 資源得以釋出,不致以 100% 來占用系統。

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

 

VB6:使用DoEvents

 

 

Private 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" (ByVal dwMilliseconds As Long)
Public Function MyDoEvents(Optional ByVal dwMilliseconds As Long = 1)
   MyDoEvents = DoEvents()
   Sleep dwMilliseconds
End Function

myDoEvents的確讓人興奮,99%0%了,但別忘了它有sleeprun的速度是會比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(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

 

C#.NET:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;


namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }


        private void button1_Click(object sender, EventArgs e)
        {
            int i = 0;
            while (i < 10000)
            {
                listBox1.Items.Add  (i.ToString() + "\r\n");
                Application.DoEvents();
                System.Threading.Thread.Sleep(1);
                i++;
            }

        }

    }

}

 

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

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

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo