C#中Thread.Sleep()的作用及用法

pamxy發表於2014-01-17

轉自:http://mcgtts.iteye.com/blog/798963

Thread.Sleep 函式來使執行緒掛起一段時間.

Thread.Sleep(0) 表示掛起0毫秒,你可能覺得沒作用,你要寫Thread.Sleep(1000) 就有感覺了。似乎毫無意義。

MSDN的說明:指定零 (0) 以指示應掛起此執行緒以使其他等待執行緒能夠執行。
Thread.Sleep(0) 並非是真的要執行緒掛起0毫秒,意義在於這次呼叫Thread.Sleep(0)的當前執行緒確實的被凍結了一下,讓其他執行緒有機會優先執行。Thread.Sleep(0) 是你的執行緒暫時放棄cpu,也就是釋放一些未用的時間片給其他執行緒或程式使用,就相當於一個讓位動作。


1    Thread th = new Thread(new ThreadStart(MainForm.StartSplash));
2    th.Priority = ThreadPriority.AboveNormal;
3    th.Start();
4    Thread.Sleep(0);
5
6    base.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
7    this.Initialize();

例如:

我們的run()這個函式一般是實現這樣的功能,定時的處理遊戲邏輯gameLogic()和重畫螢幕paint()。注意這裡的定時是本文的重點,如果執行遊戲邏輯和重畫螢幕的間隔時間不為固定的話。一定破壞遊戲性和遊戲畫面的真實性。


好了,我們看看一般的處理方法()

軟體開發網

publicvoidrun(){


while(true){

軟體開發網


gameLogic();//處理遊戲邏輯


repaint();//呼叫paint()重畫螢幕


Thread.sleep(500);//執行緒sleep0.5秒

 

}

 

}


看上去好象是每次的間隔就是0.5秒。不過有沒有想過如果一個複雜邏輯的遊戲gameLogic(),和paint()實際上也是需要不少時間來處理的,而且對於一個複雜邏輯的遊戲來說每次處理的時間長度都不相同,可能第一次gameLogic() paint()的時間是0.1秒下一次又有可能是0.01秒。這樣不就造成了間隔時間的不固定嗎。所以我們必須把gameLogic(),和paint()的運算時間計算進去,就象下面那樣。

publicvoidrun(){

time0=System.currentTimeMillis();

while(true){

 

time1=System.currentTimeMillis(); 軟體開發網


timePassed=time1-time0;


time0=time1;


gameLogic();//處理遊戲邏輯

 

repaint();

 

time1=System.currentTimeMillis();


if(time1-time0<RUN_RATE){

 

try{

http://www.mscto.com


Thread.sleep(RUN_RATE-(time1-time0));


}

http://www.mscto.com


catch(InterruptedExceptione){
}

}

}

}

文章來自學IT網:http://www.xueit.com/html/2009-05/21_1777_00.html


相關文章