如果要采取具体的初始化和结束与大卫的回答像事件做护理意味着你必须分配为您创建的每个线程的事件。这意味着要么添加一个特定的构造函数来传递它们,要么创建处于挂起模式的线程。
个人而言,我真的不喜欢不必记得做所有这些事情,因此会去一个更多态性的解决方案:
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
做的。
换句话说,是的。彼得,你这样做的担心是什么? –