Delphi for TThread.OnTerminate指出:
分配给OnTerminate事件的方法在主线程的上下文中执行,而不是在被终止的线程的上下文中执行。
如果线程是在另一个线程中创建的,而不是在主线程中创建,那么情况是否如此?
那么,OnTerminate是在创建TThread的线程中调用的,还是在主线程中调用的?IDE没有告诉我这一点。调试时,在OnTerminate事件中没有看到活动线程。*-/
发布于 2021-01-20 19:11:21
文件是正确的。默认情况下,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;https://stackoverflow.com/questions/65815922
复制相似问题