Multithreading 线程终止方法的实现重写

Multithreading 线程终止方法的实现重写,multithreading,delphi,Multithreading,Delphi,我试图重写虚拟TThread::Terminate方法,但我发现只有在设置了Terminated标志后才会调用我的重写。正确的方法是什么 TTestThrd = class(TThread) private { Private declarations } protected { Protected declarations } procedure Execute(); override; procedure DoTerminate(); override;

我试图重写虚拟TThread::Terminate方法,但我发现只有在设置了Terminated标志后才会调用我的重写。正确的方法是什么

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