2010-01-22 47 views
1

我目前有一個應用程序,可以生成單個獲勝表單的多個實例。表單的每個實例都有一個計時器,它以約1滴答/秒的速率更新一些控件和表單本身的一些屬性。一旦應用程序達到一定數量的表單,它會停止繪製計時器內發生的「更新」。 (我的理解是Application.DoEvents()處理全部跨應用程序的掛起窗口消息(其中,我的理解是,Application.DoEvents()處理所有掛起的窗口消息跨越應用程序(其中可能包括其他計時器的「滴答」? - 不確定),當我希望處理的所有內容都是重新繪製表格後,現在已經更新了一些控件)。在表單級別是否存在「Application.DoEvents」?

回答

5

我不清楚你爲什麼要打電話給DoEvents。爲什麼不讓窗口適當地重新繪製?它現在的行爲方式有什麼問題?

呼叫至DoEvents通常表明,東西應該是在後臺線程 - 在你的情況下,它聽起來像它實際上可能僅僅是因爲你有太多的活動正在進行。如果你的圖形用戶界面非常複雜,以至於無法在一秒鐘內重新繪製,那麼這聽起來可能是用戶界面本身的設計問題。

5

如果你只是想要一個窗體或一個特定的控件來重畫自己,只需在窗體/控件上調用Control.Refresh即可。

這就是說,這通常是(像Application.DoEvents一樣)重新設計的順序。如果你有這樣的長時間運行的進程,將工作推入BackgroundWorker是一個好主意,這將使實際的計算工作在後臺線程中運行,並防止UI無響應。

+0

謝謝你。我在「配置」按鈕單擊過程中更新了2-3次狀態欄消息,並認爲我需要使用doEvents刷新消息。但更新很好。 – Joe 2010-02-11 23:20:06

2

有三種類別的Windows消息由消息循環和對Application.DoEvents()的調用分派。首先是使用SendMessage()發送的消息。它們很重要,它們需要立即調度,因爲有一些其他程序正在等待SendMessage()調用的結果。它們不放在消息隊列中,Windows直接調用窗口過程。

然後有PostMessage()放在消息隊列中的消息。他們可以等待,他們只是通知。所有的鍵盤和鼠標消息都適合該類別。

然後是低優先級消息,WM_TIMER和WM_PAINT。只有在沒有別的事情的時候纔會派發它們,沒有SendMessage掛起,並且消息隊列是空的。

聽起來像是你陷入了一種情況,那就是你嚴重捱餓Windows,以至於無法繞過調度這些低優先級的消息。可能既沒有獲得計時器蜱也沒有繪製事件了。每秒只調用DoEvents一次肯定會這樣做。這很糟糕,您的程序現在也影響其他程序的運行。你必須解決這個問題。通過重新設計您的應用程序來實現,從而不再依賴DoEvents。

0

我2C:

已經在各個形式的計時器會降低性能變得非常緩慢。每個第二個時間間隔的每個窗口將要求應用程序切換到該窗口的「上下文」並執行一些代碼。整個開關可能比您的代碼實際運行時間要長。再加上可能的事實,即所有的表單都處於相同的「上下文」中。如果可能的話

而是考慮這樣的事情:

List<MyForm> listofmyform; 

Timer t = new Timer() 
t.tick += delegate 
{ 
    foreach(MyForm thisform in listofmyform) 
     thisform.DoUpdate(); 
} 

這隻能使用一個定時器來更新你所有的形式,只需要一個「上下文切換」,並可能會治好你遇到了一些性能問題。

+0

這個不存在的DoUpdate()是什麼? – 2012-05-16 19:25:06