我目前有一個應用程序,可以生成單個獲勝表單的多個實例。表單的每個實例都有一個計時器,它以約1滴答/秒的速率更新一些控件和表單本身的一些屬性。一旦應用程序達到一定數量的表單,它會停止繪製計時器內發生的「更新」。 (我的理解是Application.DoEvents()處理全部跨應用程序的掛起窗口消息(其中,我的理解是,Application.DoEvents()處理所有掛起的窗口消息跨越應用程序(其中可能包括其他計時器的「滴答」? - 不確定),當我希望處理的所有內容都是重新繪製表格後,現在已經更新了一些控件)。在表單級別是否存在「Application.DoEvents」?
回答
我不清楚你爲什麼要打電話給DoEvents
。爲什麼不讓窗口適當地重新繪製?它現在的行爲方式有什麼問題?
呼叫至DoEvents
通常表明,東西應該是在後臺線程 - 在你的情況下,它聽起來像它實際上可能僅僅是因爲你有太多的活動正在進行。如果你的圖形用戶界面非常複雜,以至於無法在一秒鐘內重新繪製,那麼這聽起來可能是用戶界面本身的設計問題。
如果你只是想要一個窗體或一個特定的控件來重畫自己,只需在窗體/控件上調用Control.Refresh即可。
這就是說,這通常是(像Application.DoEvents一樣)重新設計的順序。如果你有這樣的長時間運行的進程,將工作推入BackgroundWorker是一個好主意,這將使實際的計算工作在後臺線程中運行,並防止UI無響應。
有三種類別的Windows消息由消息循環和對Application.DoEvents()的調用分派。首先是使用SendMessage()發送的消息。它們很重要,它們需要立即調度,因爲有一些其他程序正在等待SendMessage()調用的結果。它們不放在消息隊列中,Windows直接調用窗口過程。
然後有PostMessage()放在消息隊列中的消息。他們可以等待,他們只是通知。所有的鍵盤和鼠標消息都適合該類別。
然後是低優先級消息,WM_TIMER和WM_PAINT。只有在沒有別的事情的時候纔會派發它們,沒有SendMessage掛起,並且消息隊列是空的。
聽起來像是你陷入了一種情況,那就是你嚴重捱餓Windows,以至於無法繞過調度這些低優先級的消息。可能既沒有獲得計時器蜱也沒有繪製事件了。每秒只調用DoEvents一次肯定會這樣做。這很糟糕,您的程序現在也影響其他程序的運行。你必須解決這個問題。通過重新設計您的應用程序來實現,從而不再依賴DoEvents。
我2C:
已經在各個形式的計時器會降低性能變得非常緩慢。每個第二個時間間隔的每個窗口將要求應用程序切換到該窗口的「上下文」並執行一些代碼。整個開關可能比您的代碼實際運行時間要長。再加上可能的事實,即所有的表單都處於相同的「上下文」中。如果可能的話
而是考慮這樣的事情:
List<MyForm> listofmyform;
Timer t = new Timer()
t.tick += delegate
{
foreach(MyForm thisform in listofmyform)
thisform.DoUpdate();
}
這隻能使用一個定時器來更新你所有的形式,只需要一個「上下文切換」,並可能會治好你遇到了一些性能問題。
這個不存在的DoUpdate()是什麼? – 2012-05-16 19:25:06
- 1. 在調用Application.DoEvents()
- 2. .net掛在Application.DoEvents
- 3. 在mysql/mariadb是索引存儲數據庫級還是在表級別?
- 4. ptrace是否在用戶級別或內核級別上工作?
- 5. Google Analytics中是否存在任何頁面級別的限制?
- 6. 是否存在調用堆棧級別限制?
- 7. Excel中的分組深度級別是否存在限制?
- 8. 檢查是否存在表單輸入
- 9. PHPExcel檢查表單是否存在
- 10. 檢查表單是否已經存在
- 11. 檢查表單元素是否存在
- 12. 是否可以在頁面級別禁用單個cookie
- 13. 在表單級別處理鍵盤
- 14. django modelform驗證在表單級別
- 15. 替代Application.DoEvents()在WPF
- 16. 是否存在SQLServer錯誤嚴重性級別的文本表示?
- 17. Application.DoEvents();
- 18. CakePHP安全級別表單
- 19. 是否在所有深度或僅在最高級別釋放()空閒內存?
- 20. drupal路徑別名是否存在
- 21. LinkedIn中是否存在性別字段?
- 22. 檢查表是否存在
- 23. 檢查表是否存在
- 24. 檢查表是否存在
- 25. 檢測表是否存在
- 26. 垃圾收集是否發生在流程級別或應用程序級別?
- 27. 是什麼級別?在HTML5
- 28. proc/[pid]/status中的VmData的單位是否存儲在別處?
- 29. QThread是在用戶級別,內核級別還是兩者上?
- 30. Application.DoEvents()在Java中等價嗎?
謝謝你。我在「配置」按鈕單擊過程中更新了2-3次狀態欄消息,並認爲我需要使用doEvents刷新消息。但更新很好。 – Joe 2010-02-11 23:20:06