我有多线程应用程序,当应用程序结束时我遇到了一个小问题:我可以通过在 Form1.OnDestroy
事件中调用 TThread.Terminate
方法来正确终止线程处理程序,但终止确实需要一些时间,因此我无法释放内存(通过 TThread.Free 方法)。
不幸的是,由于某些其他原因,我必须将 TThread.FreeOnTerminate
属性设置为 false,以便线程对象在线程终止后不会自动销毁。
我的问题可能有点傻,我早就应该知道了,但是这样可以吗,线程会自动销毁(因为应用程序刚刚结束),还是有问题,内存会被破坏? “丢失的”?非常感谢您的解释。
最佳答案
您应该等待线程终止,然后再开始关闭应用程序的其余部分,否则共享资源可能会在线程脚下被释放,可能会导致一串访问违规行为。等待线程终止后,您可以释放它。事实上,这就是 TThread
析构函数为您所做的事情。
如果没有共享资源,那么当然,让它自行消亡。即使线程在主线程之后终止,所需要的只是所有线程退出以使程序终止。与线程对象关联的任何内存都将被清理并与其他所有内容一起返回给操作系统。
但是,要小心!如果您的线程需要一段时间才能退出,则可能会导致僵尸进程坐在那里,在没有 GUI 的情况下不断运行。这就是为什么在线程循环中非常经常检查终止
标志并退出线程非常重要。
N@
关于Delphi - 当应用程序退出时,未释放(但终止)的线程会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209821/