Multithreading 线程终止方法的实现重写
我试图重写虚拟TThread::Terminate方法,但我发现只有在设置了Terminated标志后才会调用我的重写。正确的方法是什么Multithreading 线程终止方法的实现重写,multithreading,delphi,Multithreading,Delphi,我试图重写虚拟TThread::Terminate方法,但我发现只有在设置了Terminated标志后才会调用我的重写。正确的方法是什么 TTestThrd = class(TThread) private { Private declarations } protected { Protected declarations } procedure Execute(); override; procedure DoTerminate(); override;
TTestThrd = class(TThread)
private
{ Private declarations }
protected
{ Protected declarations }
procedure Execute(); override;
procedure DoTerminate(); override;
public
{ Public declarations }
end;
procedure TTestThrd.Execute();
var
bTerminated: Boolean;
begin
// This is the main thread loop
try
while (not Terminated) do
begin
// Sleep or use TEvent::Waitfor...
end;
finally
// Terminated (or exception) so free all resources...
bTerminated := True; // Why is this called...
end;
end;
procedure TTestThrd.DoTerminate();
var
bDoTerminateCalled: Boolean;
begin
bDoTerminateCalled := True; // ...before this?
inherited;
end;
如果希望在设置Terminate
属性之前调用方法,则必须重写该方法。终止
方法:
通过将Terminated
属性设置为true,向线程发出终止信号
从文件中:
DoTerminate
调用ontterminate
事件处理程序,但不终止线程
在OnTerminate
事件之前但在Terminate
属性设置为True
之后调用的另一个重要过程在TThread
类中声明为abstract
virtual
我现在没有带IDE,但我想如果你查看
TThread
类,你会发现OnTerminate
事件处理程序在Terminate
属性设置为True
后被触发,据我所知,问题中缺少信息。阅读前面的问题()和评论线索很重要
您正试图安排对终止的调用发出线程正在等待的事件的信号。为了实现这一点,您需要将调用挂接到Terminate
。等待DoTerminate
或OnTerminate
是没有用的,因为它们是在线程过程完成后执行的
在Delphi的现代版本中,您可以覆盖。这正是你需要的。它从内部触发终止
在旧版本的Delphi中,该方法的日期早于此方法,因此无法从Terminate
方法得到通知。据我理解,这是关键。您希望钩住终止
,并且在添加终止集
之前,不存在这样的钩子
如果TerminatedSet
对您不可用,那么您需要在类上提供一个调用Terminate
的方法,然后执行您必须执行的任何其他操作。例如:
procedure TMyThread.SignalAndTerminate;
begin
FTerminationEvent.SetEvent;
Terminate;
end;
这看起来是答案。似乎在TThread.Execute方法完成后调用了TThread.DoTerminate,其主要目的是调用TThread.OnTerminated事件。我怀疑它的一个常见用途可能是释放资源?请注意,TThread::Terminate未声明为虚拟,因此可以直接重写它吗?TThread::DoTerminate被声明为虚拟。@a它应该像您所说的那样,但也可以处理Execute
方法中发生的异常,以便记忆。抱歉,目前没有IDE,我无法检查TerminatedSet不是抽象的。无法覆盖终止。哦。。。因为这显然是一堆废话,所以不应该被接受。请考虑删除已接受的标志,我将删除答案本身。我认为没有理由编辑我的答案,因为另一个答案已经说明了我没有表达的意思。同时我要说的是“TerminatedSet不是抽象的。Terminate不能被重写。”谢谢D