第一条规则是线程主要执行程序方法应该被写入,以便它们可以正常发送并关闭,第二条规则是不应该只关闭应用程序的主线程,然后希望其他线程在自己的时间内关闭,为了安全起见,您应该指示所有后台线程停止,等待关闭完成,然后关闭主线程。一个最小的螺纹例如:
procedure TMyThread.Execute;
begin
Init;
while not Terminated do
OneWorkItem; // inside OneWorkItem, you ALSO need to check for Terminated
end;
一个最小的主要形式/主线程例如:
procedure TMyMainForm.CheckAndShutdown;
begin
if FPendingShutdownFlag then
if AllBackgroundThreadsTerminated then
Self.Close;
end;
您可以设置FPendingShutdownFlag并具备上述功能从应用程序空闲处理循环中调用。当用户单击主窗体FormClose时,如果AllBackgroundThreadsTerminated返回false,请将CanClose设置为false,然后设置FPendingShutdownFlag := true
。
如果你制作了一个无限循环(虽然是true),应用程序并没有干净地关闭,即使它看起来像你。不知何故,应用程序被终止,并且正在运行的线程可能会突然消失,或者它们可能会死锁或以其他方式失败,因为它们可能正在使用线程2中的资源,并且正忙于在线程1中释放。
您可能有一个或多个故意争用条件,因为您可能没有将您的线程执行方法写成可中断的,或者您可以在确定后台线程已经启动之前开始关闭主应用程序线程和VCL及其对象完全关闭。
你有没有可以无限阻止的EnterCriticalSection代码?这是一个非常常见的死机,在关机时就能正常工作。 – 2011-06-13 18:19:36