我試圖重寫虛的TThread :: Terminate方法,但我發現我的覆蓋終止標誌設置只之後被調用。什麼是實施這個的正確方法?實現覆蓋線程終止方法
TTestThrd = class(TThread)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Execute(); override;
procedure DoTerminate(); override;
public
{ Public declarations }
end;
procedure TTestThrd.Execute();
var
bTerminated: Boolean;
begin
// This is the main thread loop
try
while (not Terminated) do
begin
// Sleep or use TEvent::Waitfor...
end;
finally
// Terminated (or exception) so free all resources...
bTerminated := True; // Why is this called...
end;
end;
procedure TTestThrd.DoTerminate();
var
bDoTerminateCalled: Boolean;
begin
bDoTerminateCalled := True; // ...before this?
inherited;
end;
這看起來像答案。它看起來TThread.DoTerminate在TThread.Execute方法完成後調用,它的主要目的是調用TThread.OnTerminated事件。我懷疑這可能是一個共同的使用可以釋放資源? – AlainD
請注意,TThread :: Terminate沒有聲明爲虛擬的,所以可以直接覆蓋它? TThread :: DoTerminate被聲明爲虛擬。 – AlainD
@AlainD它應該像你說的,但也處理'Execute'方法中發生的異常,我記得。對不起,目前沒有IDE我無法檢查 – fantaghirocco