如果要採取具體的初始化和結束與大衛的回答像事件做護理意味着你必須分配爲您創建的每個線程的事件。這意味着要麼添加一個特定的構造函數來傳遞它們,要麼創建處於掛起模式的線程。
個人而言,我真的不喜歡不必記得做所有這些事情,因此會去一個更多態性的解決方案:
type
TInitializeFinalizeThread = class(TThread)
protected
procedure InitializeExecution; virtual;
procedure FinalizeExecution; virtual;
procedure InternalExecute; virtual;
procedure Execute; override;
end;
procedure TInitializeFinalizeThread.Execute;
begin
InitializeExecution;
try
InternalExecute;
finally
FinalizeExecution;
end;
end;
需要做奧萊東西線程可能再有一個共同的基礎,需要護理初始化和finialization的:
type
TOleThread = class(TInitializeFinalizeThread)
protected
procedure InitializeExecution; override;
procedure FinalizeExecution; override;
end;
procedure TOleThread.InitializeExecution;
begin
CoInitialize;
end;
procedure TOleThread.FinalizeExecution;
begin
CoUninitialize;
end;
這意味着,實際上要做些什麼類可以剛剛從TOleThread
繼承和放心,初始化和結束已經照顧,所以他們只需要覆蓋InternalExecute
。
type
TWordMailMergeThread = class(TInitializeFinalizeThread)
protected
procedure InternalExecute; override;
end;
procedure TWordMailMergeThread.InternalExecute;
begin
// Whatever you need this to do.
end;
雖然他們當然可以自由重寫InitializeExecution
和FinalizeExecution
方法來設置,並退出至OleServer連接(字在這個例子中),而不是在InternalExecute
做的。
換句話說,是的。彼得,你這樣做的擔心是什麼? –