首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TThread.OnTerminate执行线程

TThread.OnTerminate执行线程
EN

Stack Overflow用户
提问于 2021-01-20 19:00:22
回答 1查看 229关注 0票数 1

Delphi for TThread.OnTerminate指出:

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

如果线程是在另一个线程中创建的,而不是在主线程中创建,那么情况是否如此?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-20 19:11:21

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

代码语言:javascript
复制
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()来调用您想要的处理程序,例如:

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65815922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档