2011-02-02 30 views
1

我在我的應用程序上做了一個同步線程,我想知道是否有一種方法讓線程保持打開狀態,直到它完成同步過程,如果關閉應用程序窗體?讓線程在窗體上運行關閉

回答

1

在Rob的優秀回答的評論中,提出了在等待時顯示UI的問題。如果你需要在等待的時候顯示UI,那麼你需要更高級的等待TThread.WaitFor。這是我使用的地方,依靠MsgWaitForMultipleObjects

procedure WaitUntilSignaled(Handle: THandle; ProcessMessages: Boolean); 
begin 
    if ProcessMessages then begin 
    Application.ProcessMessages;//in case there are any messages are already waiting in the queue 
    while MsgWaitForMultipleObjects(1, Handle, False, INFINITE, QS_ALLEVENTS)=WAIT_OBJECT_0+1 do begin 
     Application.ProcessMessages; 
    end; 
    end else begin 
    WaitForSingleObject(Handle, INFINITE); 
    end; 
end; 

.... 

Form.Show; 
WaitUntilSignaled(Thread.Handle, True); 
Form.Close; 
6

在您的DPR文件中調用線程的WaitFor方法,在Application.Run之後。如果線程已經完成運行,則WaitFor將立即返回。否則,它會暫停主線程,直到另一個線程終止。 (您必須確保該變量仍然指的是有效的TThread實例,因此不要設置其FreeOnTerminate屬性。)

除了允許線程的簡單問題外,還有其他一些事情可能需要考慮繼續運行:

  • 程序只有有限的時間停止運行,如果操作系統正在關閉或者用戶正在註銷的,所以你可能沒有時間等待同步完成OS殺死你的程序之前。
  • 用戶可能想知道爲什麼程序仍然在運行,即使他們告訴它關閉,所以考慮在同步繼續時顯示一些用戶界面。
  • 如果用戶匆忙併且需要程序立即停止運行,則用戶可能不關心同步,因此在該用戶界面中,您可能希望提供「中止同步」命令。
+0

謝謝,我想我可以添加一些UI在那東西! – evilone 2011-02-02 07:18:59

+0

但是如何在Thread.WaitFor中向用戶顯示一些UI。它正在返回紅衣主教類型,是否有可能對此做些什麼? – evilone 2011-02-02 07:38:17

相關問題