实现线程Terminate方法的覆盖

Ala*_*inD -1 delphi multithreading

我试图覆盖虚拟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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

据我了解,问题中缺少信息.重要的是要阅读您之前的问题(线程内部睡眠的替代方案)和评论线索.

您正在尝试安排一个调用来Terminate指示您的线程正在等待的事件.为了实现这一点,您需要将呼叫挂钩Terminate.等待DoTerminate或者OnTerminate因为它们在线程程序完成后执行是不好的.

在现代版本的Delphi中,您可以覆盖TerminatedSet.这正是你所需要的.它是从内部发射的Terminate.

在旧版本的Delphi中,在此方法之前,无法通过该Terminate方法进行通知.据我了解,这是关键点.你希望挂钩Terminate,在TerminatedSet添加之前,没有这样的钩子存在.

如果TerminatedSet您无法使用,那么您需要在类上提供一个调用方法Terminate,然后执行您必须执行的任何其他操作.例如:

procedure TMyThread.SignalAndTerminate;
begin
  FTerminationEvent.SetEvent;
  Terminate;
end;
Run Code Online (Sandbox Code Playgroud)