给定这个例子,我们如何确保线程实例已被释放?当 Thread.FreeOnTerminate=true 并且您在 Thread.OnTerminate 事件中爆炸时,线程实例会发生什么情况?除非您处理异常并在 OnTerminate 中显式释放线程,否则线程是否孤立?
// 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;
最佳答案
您应该在 OnTerminate 处理程序中处理所有异常,因为未处理的异常将导致线程实例不会被释放(参见 Classes.ThreadProc
实现)。
只需将处理程序的主体包含在 try
..except
中并处理所有异常。
但是您的“保证 AV”示例是错误的:如果实例为 nil,Free
不会导致 AV。
关于multithreading - 如果 FreeOnTerminate=true 并且在 OnTerminate 中抛出异常,线程会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6047874/