簡體   English   中英

表單級別是否有“ Application.DoEvents”?

[英]Is there an 'Application.DoEvents' at the form level?

我目前有一個應用程序,可以產生一個勝利形式的多個實例。 窗體的每個實例都有一個計時器,該計時器以大約1滴答/秒的速度更新窗體本身的一些控件和某些屬性。 一旦應用程序達到一定數量的表單,它將停止繪制計時器刻度內發生的“更新”。

我想將UI線程放在計時器底部,並允許在不調用Application.DoEvents的情況下重繪窗體(我的理解是Application.DoEvents()處理整個應用程序中所有未決的窗口消息(可能包括其他計時器的滴答聲) '?-不確定)現在我要處理的是重新繪制表單,因為已經更新了許多控件)。

如果只希望表單或特定控件重繪自身,只需在有問題的表單/控件上調用Control.Refresh

話雖如此,這通常(如Application.DoEvents)是重新設計正常的標志。 如果您有這樣長時間運行的流程,則最好將工作推送到BackgroundWorker中 ,這將使實際的計算工作在后台線程中運行,並防止UI變得無響應。

對我尚不清楚,您為什么根本要調用DoEvents 為什么不讓窗口適當地重新繪制自身呢? 目前的行為方式有什么問題?

DoEvents調用通常表明應該在后台線程中進行某些操作-在您的情況下,聽起來好像實際上可能是因為您正在進行的事件太多。 如果您的GUI非常復雜,以至於無法在一秒鍾內重新繪制自己,那么聽起來這可能是UI本身的設計問題。

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

然后,使用PostMessage()將消息放入消息隊列中。 他們可以等待,它們僅僅是通知。 所有的鍵盤和鼠標消息都適合該類別。

然后是低優先級消息WM_TIMER和WM_PAINT。 僅在沒有其他事情要做,沒有SendMessage掛起且消息隊列為空時才分派它們。

聽起來您陷入了使Windows嚴重挨餓的境地,以至於無法再分發那些低優先級的消息了。 可能不再獲得計時器Ticks或Paint事件。 僅每秒調用一次DoEvents肯定會做到這一點。 這很糟糕,您的程序現在也正在影響其他程序的運行。 您必須解決該問題。 為此,請重新架構您的應用程序,以使您不再依賴DoEvents。

我的2c:

每種格式都有一個計時器會降低爬網的性能。 每個第二間隔的窗口將請求應用程序切換到該窗口的“上下文”並執行一些代碼。 整個切換可能比您的代碼實際運行所需的時間更長。 再加上所有表格都在同一個“上下文”中的可能事實。

如有可能,請考慮這樣的事情:

List<MyForm> listofmyform;

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

這僅使用一個計時器來更新所有表單,僅需要一個“上下文切換”,就可能解決您遇到的一些性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM