Delphi - 当应用程序退出时,未释放(但已终止)的线程会发生什么?

Ond*_* C. 4 delphi multithreading vcl delphi-6

我有多线程应用程序,当应用程序结束时我遇到了一些问题:我可以通过TThread.TerminateForm1.OnDestroy事件处理程序中调用方法来正确终止线程,但终止确实需要一些时间,因此我无法释放内存(通过TThread.Free方法).不幸的是,由于某些其他原因,我必须将TThread.FreeOnTerminate属性设置为false,因此线程终止后线程对象不会自动销毁.

我的问题可能有点傻了,我很久以前就已经知道了,但是这样就可以了,线程会被自动销毁(因为应用程序刚刚结束),或者它是一个问题而内存会"丢失" ?非常感谢您的解释.

Nat*_*Nat 7

在开始关闭应用程序的其余部分之前,您应该等待线程终止,否则共享资源可能会在线程脚下释放,可能导致一系列访问冲突.等待线程终止后,您可以释放它.事实上,这就是TThread析构函数为您所做的事情.

如果没有共享资源,那么确定,让它自己死掉.即使线程在主线程之后终止,所需要的只是所有线程退出以使程序终止.与线程对象关联的任何内存都将被清除,并将其与其他所有内容一起返回给操作系统.

但是,小心!如果您的线程需要一段时间才能退出,那么可能会导致僵尸进程在没有GUI的情况下在那里停留.这就是为什么它是非常检查的重要Terminated标志非常往往在线程循环,并退出线程.

N - [

  • 你的代码是不必要的复杂.自从引入`TThread`以来,析构函数就已经调用了`Terminate`和`WaitFor`.一个简单的"Free"(或"FreeAndNil")就足够了.如果线程类有一个被重写的析构函数,它应该在其中调用`Terminate`和`WaitFor`本身,因为它不能在线程proc结束之前销毁字段.将所有这些留给线程类的用户太危险了. (7认同)