2013-05-12 54 views
0

我目前正在創建一個GUI應用程序框架作爲Ionite框架的一部分。我將用我的學校最後的項目, 我的問題是:使用C#:爲什麼我的動畫線程運行得如此緩慢

林線程維護動畫,

ParameterizedThreadStart iv = new ParameterizedThreadStart(o => { 
    this.Size = (Size)o; 
}); 
new Thread(()=>{ 
    float stepWidth = (targetWidth-currentWidth)/transition; 
    float baseWidth = currentWidth; 
    int tick=transition; 
    while(tick-- > 0){ 
    baseWidth+=stepWidth; 
    Invoke(iv,new Size(baseWidth,this.Height)); 
    Thread.Sleep(1); 
    } 
}).Start(); 

假設這個操作符是一個控制對象。當我在我的控制對象上使用背景時,它比預期的更長。

我的代碼/方法有什麼問題? 謝謝

+2

你不能那樣做。在UI線程上使用計時器。 – SLaks 2013-05-12 16:38:06

+0

我在上面的問題上編輯了我的代碼,因此可以安全地進行跨線程操作(我認爲) – 2013-05-12 16:41:26

+1

不。從不同的線程處理UI控件永遠不安全。 – SLaks 2013-05-12 16:42:58

回答

2
Thread.Sleep(1); 

這不會做你希望它做的。 Sleep()方法只能在與操作系統時鐘分辨率相等或整數倍的時間間隔內休眠。默認情況下,每秒打64次。或15.625毫秒。所以你的動畫效果比你想象的要慢16倍。

這在技術上可以通過禁止timeBeginPeriod(1)來解決。但是你不應該這樣做,16毫秒足以使任何動畫看起來順滑到人眼。只需將stepWidth變量變大16倍即可。假設否則你的UI線程可以跟上所需的繪畫評分。

下一步是認識到使用線程是無用的,它仍然只能像Invoke()一樣快。這需要UI線程足夠響應。因此,使用普通的同步Timer來代替完全相同的結果,減去線程的開銷。

+0

有沒有辦法獲得操作系統支持的延遲或最小滴答? Timer和Thread有什麼區別? Isnt計時器也是一個線程? – 2013-05-12 17:39:40

+0

如果你理解我發佈的答案,那麼你不應該對這些後續問題的答案感興趣。如果需要,可以再次點擊Ask Question按鈕詢問他們。 – 2013-05-12 17:45:04

相關問題