我正在阅读another question here关于需要进行初始化和建议连接到ADO对象的答案。我需要做一些类似于在线程中执行soap调用的事情。
有没有办法覆盖TThread对象,以便在在线程内执行之前和之后自动运行?
对于这个例子,我们正在转换为SOAP后端,并且必须做大量的工作,这样可以节省一些时间来覆盖新的SOAP友好的TThread而不是为每个线程添加coinitialize和couninitialze。但一般来说,初始化和清理线程内部的线程有时似乎是个好主意。现在看起来你只能做一个或另一个。
答案 0 :(得分:8)
也许你想要这样的东西:
type
TMyThread = class sealed(TThread)
private
FOnBeforeExecute: TProc;
FOnExecute: TProc;
FOnAfterExecute: TProc;
protected
procedure Execute; override;
public
property OnBeforeExecute: TProc read FOnBeforeExecute write FOnBeforeExecute;
property OnExecute: TProc read FOnExecute write FOnExecute;
property OnAfterExecute: TProc read FOnAfterExecute write FOnAfterExecute;
end;
procedure TMyThread.Execute;
begin
if Assigned(OnBeforeExecute) then
OnBeforeExecute;
try
if Assigned(OnExecute) then
OnExecute;
finally
if Assigned(OnAfterExecute) then
OnAfterExecute;
end;
end;
我把它变成了一个密封的类,所以你不能用破坏设计的东西替换Execute
。额外的好处是您可以使用事件将线程过程与实现类分离。
答案 1 :(得分:5)
如果你想要注意特定的初始化和最终化,那么使用像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
。< / p>
type
TWordMailMergeThread = class(TInitializeFinalizeThread)
protected
procedure InternalExecute; override;
end;
procedure TWordMailMergeThread.InternalExecute;
begin
// Whatever you need this to do.
end;
虽然他们当然可以自由地覆盖InitializeExecution
和FinalizeExecution
方法来设置和退出与OleServer(本例中的Word)的连接,而不是在{{1}中进行}。