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

标签 multithreading delphi

给定这个例子,我们如何确保线程实例已被释放?当 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/

相关文章:

java - Delphi 到 Java 代码转换 : image. canvas.pixels

delphi - 是否有任何实现基本IDE结构的Delphi开源项目?

C 编程 : Debugging with pthreads

java - 在ArrayBlockingQueue中,为什么将final成员字段复制到本地final变量中?

java - Android:蓝牙 - 如何读取传入数据

windows - Delphi 中字符串操作的访问冲突

delphi - 如何隐藏控制台窗口?

java - 与单生产者模式相比,lmax disruptor 在多生产者模式下太慢

c++ - 执行异步作业的函数

unit-testing - 我可以将类型参数传递给 DUnitx 中的测试用例吗?