2012-04-26 54 views
1

我需要知道是否使用允許我使用整個應用程序的ProcessMessages是合法的。ProcessMessages和應用程序的使用

僞代碼:

主線程調用按鈕 - 搜索。

procedure ButtonOnClick; 
begin 
    var1 = ExecuteSearch(); 
end;  

function ExecuteSearch:Something; 
begin 
thread.StartThread; 
while thread.Finished do 
Application.ProcessMessages; 
result := something; 
end; 

當我使用這個結構我可以點擊我的軟件的其他部分,並使用它。但我不知道這是如何工作的。如果它的安全。

+0

這是純粹的安全。你只需要確保線程不會卡住。因爲如果是這樣,主程序會運行,但是你將無法終止程序 – 2012-04-26 13:39:55

+2

'while thread.Finished'? – 2012-04-26 15:11:08

+2

不要在GUI事件處理程序中等待。 – 2012-04-27 21:28:33

回答

2

儘管代碼是安全的,但您也可以在開始的線程中使用OnTerminate事件。這樣你可以讓Delphi控制如何從後臺線程回傳到主線程。它在內部使用線程的Synchronize方法,您可以使用它自己讓線程將中間進度信息發佈到主線程。

+0

我可以在哪裏閱讀這個主題,所以我可以理解它是否太安全? – userbb 2012-04-26 13:48:32

+0

在這裏閱讀更多:http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.Synchronize and here http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.OnTerminate – 2012-04-26 13:50:53

2

雖然這可以安全,你玩火。你有再次入侵的風險。你必須確保用戶不能再次按下按鈕。我相信你在搜索運行時已經禁用了它。在您第一次致電ProcessMessages之前,您必須確保它已被禁用。

我的建議永遠是避免使用ProcessMessages。更好的辦法是啓動線程並安排它在完成時通知主線程。當然,在線程運行時仍然需要禁用按鈕。

但是,如果你真的必須使用ProcessMessages不要這樣做,像這樣的繁忙循環。使用整個處理器等待長時間運行的搜索操作完成沒有多大意義。使用更加智能的阻擋環是這樣的:

while MsgWaitForMultipleObjects(1, Thread.Handle, False, 
    INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do 
    Application.ProcessMessages; 

MsgWaitForMultipleObjects函數將阻塞,直到任一:

  1. 的消息被放置在隊列中,或
  2. 線程正在用信號通知。線程完成時發出信號。

循環終止時線程信號,但也處理任何排隊的消息。

+0

循環也需要檢查'WAIT_OBJECT_0'。線程終止時返回'WAIT_OBJECT_0'。當調用線程的隊列中存在未決消息時,將返回「WAIT_OBJECT_0 + 1」。您需要保持循環運行,直到返回「WAIT_OBJECT_0」,但在每次迭代時檢查「WAIT_OBJECT_0 + 1」。 – 2012-04-27 00:55:23

+0

@remy再次讀取代碼。循環運行,直到手柄發出信號。 – 2012-04-27 01:16:04

+0

對不起,沒有注意到'INFINITE'超時。 – 2012-04-27 01:42:02

相關問題