2015-02-11 40 views
3

假設我有一個匿名的線程做一些後臺處理:如果主線程完成,是否必須指示匿名線程退出?

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    TThread.CreateAnonymousThread(procedure begin 
    while True do begin 
     Sleep(500); 
     OutputDebugString('I am alive'); 
    end; 
    end).Start; 
end; 

線未與主線程共享任何ressources,它只是坐在那裏,並運行「永遠」。

由於沒有像Terminatefor anonymous threads這樣的內置機制,這是否意味着我不必在進程的主線程退出時通知線程?

如果您只是啓動一個新的VCL應用程序,將上面的代碼粘貼到FormCreate事件中,它會每半秒將I am alive寫入調試消息。當應用程序退出時(即通過關閉表單),看起來線程也退出了,儘管它沒有檢查任何信號。

那是好的,還是我必須執行一些信號使用TEvent或類似的通知線程?

或者是寫一個自定義的TThread後代更好,並保留一個引用到Thread.Free它後面呢?

+0

運行的線程是不能自動核爆進程終止時,和過程不完全終止是否還有線程運行。 – 2015-02-11 19:13:45

回答

6

您需要終止您創建的任何線索,甚至是匿名的線程,例如:

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    TThread.CreateAnonymousThread(procedure begin 
    while not Application.Terminated do begin // <-- 
     Sleep(500); 
     OutputDebugString('I am alive'); 
    end; 
    end).Start; 
end; 
相關問題