第一條規則是線程主要執行程序方法應該被寫入,以便它們可以正常發送並關閉,第二條規則是不應該只關閉應用程序的主線程,然後希望其他線程在自己的時間內關閉,爲了安全起見,您應該指示所有後臺線程停止,等待關閉完成,然後關閉主線程。一個最小的螺紋例如:
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