首页 > 解决方案 > TThread.OnTerminate 执行线程

问题描述

Delphi 帮助TThread.OnTerminate指出:

分配给 OnTerminate 事件的方法在主线程的上下文中执行,而不是在被终止线程的上下文中执行。

甚至在主线程之外的另一个线程中创建线程时也会出现这种情况吗?

那么,是在OnTerminate创建 的线程中调用TThread,还是在主线程中调用?IDE 没有告诉我这一点。调试时,我在OnTerminate事件中看不到活动线程。:-/

标签: multithreadingdelphitthread

解决方案


文档是正确的。默认情况下,OnTerminate事件处理程序始终在主线程中运行。在内部,TThread.DoTerminate()(在线程的Execute()方法退出后调用)用于TThread.Synchronize()调用处理程序:

function ThreadProc(Thread: TThread): Integer;
var
  ...
begin
  ...
  try
    if not Thread.Terminated then
    try
      Thread.Execute;
    except
      ...
    end;
  finally
    ...
    Thread.DoTerminate;
    ...
  end;
end;

procedure TThread.DoTerminate;
begin
  if Assigned(FOnTerminate) then Synchronize(CallOnTerminate);
end;

procedure TThread.CallOnTerminate;
begin
  if Assigned(FOnTerminate) then FOnTerminate(Self);
end;

如果您希望OnTerminate处理程序在终止线程(或您想要的任何其他线程)的上下文中运行,您可以简单地覆盖DoTerminate()以调用您想要的处理程序,例如:

type
  TMyThread = class(TThread)
    ...
  protected
    ...
    procedure Execute; override;
    procedure DoTerminate; override;
    ...
  end;

procedure TMyThread.Execute;
begin
  ...
end;

procedure TMyThread.DoTerminate;
begin
  // do whatever you want here, but DON'T call inherited!
  if Assigned(OnTerminate) then OnTerminate(Self);
end;

推荐阅读