如果FreeOnTerminate = true并且在OnTerminate中抛出异常,那么线程会发生什么?

Vec*_*tor 2 delphi multithreading

在这个例子中,我们如何确保线程实例已被释放?当Thread.FreeOnTerminate = true并且你在Thread.OnTerminate事件中爆炸时,线程实例会发生什么?线程是否是孤立的,除非你处理异常并在OnTerminate中释放线程explicitey?

// Thread constructor

constructor TMyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  Self.FreeOnTerminate := True;
end;

// TMyThread OnTerminate event

procedure TMyThread.OnTerminate(Sender: TObject);
var o: TObject;     
begin
  o:=nil;
  showmessage(o.classname); // guaranteed AV
end;
Run Code Online (Sandbox Code Playgroud)

Ond*_*lle 6

您应该处理OnTerminate处理程序中的所有异常,因为未处理的异常将导致不释放线程的实例(请参阅Classes.ThreadProc实现).只需将处理程序的主体包含在try..中,except并处理所有异常.

但是你的'保证AV'的例子是错误的:Free如果实例是零,则不会导致AV.