2012-09-02 23 views
2

我遇到了messagebox API的問題。 我使用messageboxw向用戶提問。 例如,我的程序非常忙於線程等,當用戶單擊顯示消息框的按鈕時,它不會顯示消息框,直到我的程序比以前不太忙。當我刪除消息框後,代碼執行正常。我有太多的代碼可以顯示,但也許有一些我必須照顧...Delphi中的Messagebox延遲

任何人都有過這種經歷嗎?

感謝您的幫助。

回答

10

單擊按鈕時發生的情況是消息被髮送到消息隊列。直到下一次抽取消息隊列時纔會處理該消息。因此,如果您在點擊按鈕和程序響應之間看到延遲,那是因爲消息隊列沒有及時處理。

如果你的GUI線程繁忙,那麼消息隊列將不會被泵送,直到主線程完成它正在做的任何事情。如果你的GUI線程很長時間運行,你的GUI線程會很忙。一旦排隊的按鈕點擊消息最終得到處理,則調用MessageBoxW將導致立即顯示對話框。

GUI線程無法運行的唯一原因是,如果CPU被更高優先級的線程使用。但這不太可能。應用程序使用高優先級的線程是非常不尋常的。如果你這樣做,我會感到驚訝。

如何解決問題?如果您的主線程上有長時間運行的任務,請將這些任務移至後臺線程。或者,如果您有高優先級線程停止運行GUI線程,那麼以正常優先級運行後臺線程。

+0

它不在GUI線程中運行。就像我說的,當我刪除消息框時它工作正常。我使用indy和繁忙的代碼都在OnExecute過程中執行。 –

+3

什麼不在你的GUI線程中運行?顯然然後按鈕是。如果沒有立即處理按鈕點擊,則必須運行其他必須在其中運行的按鈕,以免及時處理您的消息隊列。 –

+0

就像我說的。如果我完全錯過了這個消息箱,它就可以正常工作。 –