アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムの終了時に、確実にデータをファイルに書き出したいと思っています。

以下の場合の中で、終了処理のコードが実行されない、あるいは書き込みバッファやファイルシステムのキャッシュがフラッシュされない、等の理由で、ファイルへの書き出しが失敗する可能性があるのはどれでしょうか?
失敗する理由や、対処法も教えていただければ幸いです。
また、他にも注意すべきケースはありますでしょうか?

1.(ユーザによって)タスクマネージャから強制終了された時
2.「応答がありません」になってから(ユーザによって)強制終了された時
3.Windowsシャットダウン時に(OSによって)強制終了された時
4.何のエラーメッセージも表示されず、突然終了した時 (たまにこういうアプリありますよね?)
5.ブルースクリーンになった時

よろしくお願いします。

A 回答 (4件)

>1.(ユーザによって)タスクマネージャから強制終了された時


アプリケーションの終了処理は走りません。(WM_DESTROY時の処理、デストラクタ、コールスタックの巻き戻しは走りません)

>2.「応答がありません」になってから(ユーザによって)強制終了された時
アプリケーションのバグの可能性が高いです。ビジーループでそうなります。
※マルチスレッドだった場合他のスレッドが生きていて処理を続行している事はあります。

>3.Windowsシャットダウン時に(OSによって)強制終了された時
応答がある場合は正常な終了処理が行われますが
応答が返ってこない等の理由で強制終了した場合は終了処理は走りません。(1と同じ)

>4.何のエラーメッセージも表示されず、突然終了した時
「不正な処理を行ったため強制終了・・・」と表示される場合はバグの可能性が高いです。
例えば不正なメモリーアクセスで発生します。
>(たまにこういうアプリありますよね?)
※何も言わずに内部的には正常終了した可能性があります。

>5.ブルースクリーンになった時
メモリー破損等のハードウェアの欠損かドライバのバグで発生します。
アプリケーションレベルではないです。

どの部分の終了処理の事をいっているのかによりますが
アプリケーションの終了処理は全てにおいて実行されません。
※1、2、3、4は意図的に再現させることが可能なので試してみるとよいでしょう。

基本的にはこまめにフラッシュする事とバグの原因を追究し潰していくしかないと思います。
    • good
    • 0
この回答へのお礼

詳しい回答ありがとうございます。

try-catchとatexitで実験してみたら、両方とも強制終了では終了処理のコードは実行されませんでした。(atexitに関しては、マニュアルよく読んだら”正常終了時”って書いてあったので当然ですね)
とても勉強になりました。

アプリのバグを潰して、処理可能なエラーしか発生させないように作るのが大切なんですね。

お礼日時:2010/12/20 12:14

最大の違いは「OSがアプリに終了してほしいと要求を(まず)出す」のが1/3で「アプリがどうしようもなくなっていると判断されるのでOSが勝手に落とす」のが2/4、ということです。


つまり1/3は「OSがアプリを終了させようとしている」ことがアプリ自身に判断できる材料がありますが、2/4にはない訳です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

なるほど、アプリがどうしようもなくなっているか、が違うんですね。
違いが理解できました。

お礼日時:2010/12/20 12:03

「アプリケーションの終了処理以外の要因により終了した」ケースは全て失敗する可能性があります、というか終了処理内でのみファイルクローズなどを実施している場合はほぼ確実に失敗します。



そのようなケースの場合、2/4/5では失敗します。
これらはアプリが終了処理に入れずに終了してしまうパターンです。
2と4についてはアプリ自身に問題があるため、原因を解消するのが先。
5はOS側異常であるため、それをアプリが引き起こしたのでない限りどうしようもありません。

1と3については、まずOSから終了通知メッセージが送られるため、それを適切に処理できれば問題ありません。
ですが、処理できない場合には2のケースと同様になります。

可能な限り被害を抑える方法としては、「ファイルを開きっぱなしにしておかない」という処理が考えられます。
書き込み内容のHDDへの適用タイミングは基本的にOS次第ですが、例外としてファイルクローズ時には必ず適用されます。
ですから、こまめにファイルを閉じることで常にHDDに内容が書かれた状態を保つ、ということになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

こまめにフラッシュしてディスクに書き出すのは大事ですね。

ひとつ疑問なのですが、2と4で終了処理のコードが実行されないのはどうしてなのでしょうか?
2と4の場合と、キャッチ可能なエラーが発生した場合(終了処理のコードが実行される場合)では、どのような違いがあるのでしょうか?

お礼日時:2010/12/19 19:41

ファイルに対して書き込みを行っていれば、OSはデータ書き込みを受け付けた状態に


なっているので、OSが異常状態の、5.ブルースクリーンになった時以外は、
ファイルへの書き出しは保証されるはずです。

5.が発生したときには、データがどこまで書かれているか、というと、それはわかりません。
対策としては、プログラム起動時に、データが破損しているかどうかをチェックして、
破損していたら復旧処理を入れるとか、復元ポイントのようなものを用意しておいて、
ある時点の状態に戻すぐらいだと思います。

プログラムの終了日時を終了日時記録ファイルに記録するような機構を設けておいて、
データファイルの更新日が終了日時記録ファイルより新しければ、
アプリが正常終了しなかったと判断するとかね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

5のケースは、たぶんダメだろうと予想してましたが、その通りみたいですね。

更新日時のチェックで正常終了を判断するのは有効な手段ですね。
検討してみようと思います。

お礼日時:2010/12/19 19:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!