您的線程的Execute
方法必須定期檢查線程的Terminated
屬性的狀態。如果是True
,則線程Execute
方法必須退出。
所以,一個典型的Execute
方法可能是這樣的:
procedure TMyThread.Execute;
begin
while not Terminated do
DoNextPieceOfWork
end;
它看起來像你的線程都有自己的FActive
標誌正在執行相同的任務。這個問題是TThread
不知道它。所以你應該擺脫FActive
,而是使用內置的機制。
當你在線程上調用Free
時,它會調用Terminate
。設置Terminated
爲True
。然後它等待線程方法退出。這將發生,因爲你的線程通知Terminated
是True
並退出。然後線程的析構函數可以繼續並完成整理線程的工作。
看在你的答案代碼,倒不如寫利用現有Terminate
機制。
type
TMyThread = class(TThread)
private
FTerminateEvent: TEvent;
protected
procedure Execute; override;
procedure TerminatedSet; override;
public
constructor Create(ACreateSuspended: Boolean);
destructor Destroy; override;
end;
constructor TMyThread.Create(ACreateSuspended: Boolean);
begin
inherited Create(ACreateSuspended);
FTerminateEvent := TEvent.Create(nil, True, False, '');
end;
destructor TMyThread.Destroy;
begin
inherited;
FTerminateEvent.Free;
end;
procedure TMyThread.TerminatedSet;
begin
FTerminateEvent.SetEvent;
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// do somthing interesting!
FTerminateEvent.WaitFor(5000);
end;
end;
現在不需要單獨的Stop
方法。您可以在線索上撥打Free
。然後調用Terminate
。然後調用TerminatedSet
。然後事件發出信號。然後Execute
終止。然後線可以消失。
話雖如此,我很難想象一個5000毫秒超時會是最好的方法。我不知道你爲什麼這樣做,但我猜你正試圖調節線程,使其不能運行hot。你想避免繁忙的循環。這是令人欽佩的,但是使用固定超時並不是實現這一目標的方法。要做到這一點的方法是等待一個同步事件,通常是一個事件。然後當有更多的工作要做,事件就會變成信號,你的線程就會醒來。
檢查了這一點: http://stackoverflow.com/questions/4044855/how-to-kill-a-thread-in-delphi – kostas
從技術上講這是可能的,但它是一個真的* *糟糕的主意。不要殺死線程,告訴他們自殺。正確的解決方案是讓線程經常檢查一個標誌(例如'Terminated'屬性)。 – CodesInChaos
如果您希望您的工作線程進入睡眠狀態,請勿使用睡眠,因爲在此期間線程沒有偵聽(終止)。使用Events和WaitForSingleObject作爲例如在這裏指定:http://objectmix.com/delphi/402360-tthread-sleep-terminate.html(當谷歌搜索「delphi終止線程setevent」時發現) –