如果您想处理特定的初始化和完成,请使用 David 的回答中的事件进行处理,这意味着您必须为您创建的每个线程分配这些事件。这意味着要么添加一个特定的构造函数来传递它们,要么在挂起模式下创建线程。
就我个人而言,我真的不喜欢记住做所有这些事情,因此会寻求一个更多态的解决方案:
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;
需要执行 Ole Stuff 的线程可以有一个共同的基础来处理初始化和完成:
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(本例中为 Word)的连接,而不是在InternalExecute
.