2009-07-26 5 views
18

私はシャットダウン中に何か問題を抱えているプログラムを持っています。それはタイミングに関連し、非決定論的であるように見えます。これは、すべての共有リソースが解放された後に発生しています。シャットダウン後にメモリリークが問題になることはありません。シャットダウンシーケンスを続行し、例外メッセージボックスを表示します。Delphiプログラムをどうやって中断しますか?

誰でもその方法を知っていますか?

+1

を次のように

シャットダウンの階層がありますか?コンソールアプリですか? TApplicationベース? シャットダウンプロセスのデバッグ/イン/シャットダウンを試みていますか? –

+0

TApplicationベース、そしてはい私は、それは動作していません。タイミング関連のように見えますが、このアプリではデバッガが多かれ少なかれ役に立たないようです。理由はhttp://qc.embarcadero.com/wc/qcmain.aspx?d=76039を参照してください。 –

答えて

18

DelphiランタイムライブラリのソースコードとMicrosoftのドキュメントを参照してください。私はメイソンとポール・ワンのコメントを裏付けることができます。

Application.Terminate() 
    performs some unidentified housekeeping of application 
    calls Halt() 

    Halt() 
    calls ExitProc if set 
    alerts the user in case of runtime error 
    get rid of PackageLoad call contexts that might be pending 
    finalize all units 
    clear all exception handlers 
    call ExitprocessProc if set 
    and finally, call ExitProcess() from 'kernel32.dll' 

    ExitProcess() 
    unloads all DLLs 
    uses TerminateProcess() to kill the process 
プログラムのどのような種類がある
+0

'TApplication.Terminate()'は 'Halt()'を呼び出しません。設定されている場合、終了プロキシのリストを呼び出し、呼び出し側のスレッドのメッセージキューに 'WM_QUIT'メッセージをポストします。 'TApplication.Run()'が 'WM_QUIT'をピックアップすると、メッセージループを壊して終了し、プロジェクトのメインコードブロックに戻り、そこで終了し、プロセスのクリーンアップをトリガします。 –

4

Halt(0)は、プログラムを直ちに終了するように指示する良い古い方法でした。おそらくデルファイにやさしい方法ですが、95%はまだ停止(0)しています。 :-)

+1

これは間違いなく機能しますが、それでもすべての細分化部品と終了プロセスの素敵できれいな処理が行われます。それらの1つがメイソンの問題を誘発するなら、彼はまだ困っている。 –

4

もしHeartProがExitProcess()を使用することに失敗した場合は、DLL_PROCESS_DETACHにうまく応答しないDLLを使用している可能性があります。その場合は、TerminateProcess(getCurrentProcess、0)を使用してみてください。

このような尺度に頼ると、トピックタイトルの「きれいな」部分が依然として厳重に調査されているのか疑問に思うかもしれません。

+2

ああ、彼はそれをした後に手を洗うことができます - それをきれいに保つ! – Arafangion

1

シャットダウンがシャットダウンであったのは、死にかけているウィンドウで発生したイベント(サイズ変更されましたか?)です。すでに終了していたものを再描画しようとしました処分された。

関連する問題