デビッドの回答のように、特定の初期化とファイナライズをイベントで処理したい場合は、作成するすべてのスレッドにそれらのイベントを割り当てる必要があることを意味します。つまり、特定のコンストラクターを追加してそれらを渡すか、中断モードでスレッドを作成することを意味します。
個人的には、これらすべてのことを覚えておく必要があるのはあまり好きではないので、よりポリモーフィックなソリューションを使用します。
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
.