1

私は、(とりわけ)Windowsをシャットダウンするために使用できるMFCアプリケーションに取り組んでいます。これを行うとき、WindowsはもちろんWM_QUERYENDSESSIONとWM_ENDSESSIONをすべてのアプリケーションに送信します。ただし、問題は、一部のデストラクタの一部として、実行中に使用された特定のファイルを(CFile :: Removeを使用して)アプリケーションが削除することです。アプリケーションがWindowsによって閉じられたときに、デストラクタが呼び出されると信じる理由があります(ただし、それを確実に知ることは困難です)。

ただし、Windowsを再起動すると、削除されるはずのファイルがまだ存在していることに気付くことがあります。プログラムの実行が同じであっても、これは一貫して発生しません(これをテストするためのスクリプトがあります)。これにより、次の2つのいずれかが発生していると思います。a)デストラクタが常に呼び出されていないか、b)Remove関数が返されますが、Windowsがシャットダウンされる前にファイルが実際に削除されません。

私がこれまでに見つけた唯一の回避策は、プログラムが停止した後、システムをシャットダウンして約10秒間待機させると、ファイルが適切に削除されることです。これにより、b)が当てはまる可能性があると私は信じています。

誰かがこの問題で私を助けてくれることを願っています。

よろしくモート

4

3 に答える 3

3

プログラムが から戻るとWM_ENDSESSION、Windows はいつでもプログラムを終了できます。

セッションが終了している場合、このパラメーターは TRUE です。セッションは、すべてのアプリケーションがこのメッセージの処理から戻った後、いつでも終了できます。

セッションがすぐに終了すると、デストラクタが実行される前に終了する可能性があります。から戻るに、すべてのクリーンアップを行う必要がありますWM_ENDSESSION。後でクリーンアップを行う機会が得られるという保証はないからです。

于 2012-01-30T13:52:23.790 に答える
0

ここでの問題は、一部のバージョンの Windows で、ファイル処理操作が実際に完了する前に完了したと報告されることです。ファイルの削除を含む一部の操作が中止されるため、シャットダウンがトリガーされない限り、これは問題ではありません。

システムのシャットダウンを呼び出す前に、ファイルの削除が確認されるまでコードを強制的に待機させる (プロセスにファイルを探しさせ、ファイルが削除されたときにイベントを発生させる) ことで、これに対処することをお勧めします。

于 2012-01-30T09:11:45.470 に答える
0

システムが適切にシャットダウンされた場合 (ナットが突然停電した場合など)、キャッシュされたすべてのデータがフラッシュされます。特に、これには、ファイルの削除をコミットする必要があるグローバルファイル記述子テーブル (またはファイルシステムで呼び出されているもの) のフラッシュが含まれます。

したがって、問題は、ユーザーモードのコードが を呼び出さないDeleteFileか、(なんらかの理由で) 失敗することのようです。アプリケーション (プロセス) が終了する方法はいくつかありますが、常に d'tors が呼び出されるわけではありません。コールスタックのコンテキストで破棄される自動オブジェクトと、CRT の初期化/クリーンアップ コードによって初期化および破棄されるグローバル/静的オブジェクトがあります。

以下は、プロセスを終了する方法とその結果を簡単にまとめたものです。

  • すべてのプロセス スレッドは通常どおりに終了します (プロシージャから戻ります)。OS は、スレッドを持たないプロセスを終了します。すべての d'tors が実行されます。
  • 一部のスレッドは、によって終了するExitThreadか、によって強制終了されTerminateThreadます。これらのスレッドの自動オブジェクトは構築されません。
  • によってプロセスが終了しましたExitProcess。自動オブジェクトは破棄されず、グローバルは破棄される可能性があります (これは CRT が DLL で使用されている場合に発生します)
  • によってプロセスが終了しましたTerminateProcess。すべての d'tors が呼び出されるわけではありません。

DeleteFile(またはCFile::Removeそれがそうではない)が実際に呼び出されているかどうかを確認し、それが成功するかどうかも確認することをお勧めします。たとえば、何らかの理由で同じファイルを 2 回開く場合があります。

于 2012-01-30T09:14:25.827 に答える