あるフォームで、TStringListのSaveToFile()メソッドを発行しています。
ノートPCで、HDDの遅いモードでの運用時、
このフォームを閉じるとアプリケーションがフリーズするという現象が発生し、
テキストファイルの書き込みが完了していないのが原因ではないかと推測しました。
その根拠は、3秒ほど待ってからフォームを閉じると、
フリーズが発生しないためです。
そこで質問なのですが、SaveToFile()メソッドで、
対象のファイルの保存が完了したことを確認するにはどうすれば良いでしょうか?
試しに、ループでFileExists(当該ファイル名)を行って、
ファイルの存在をチェックして抜けるようにしてみたのですが、
これでは効果がありませんでした。
妙案がありましたらよろしくお願いします。
「TStringListのSaveToFile()メソッド」から返ってきた時には書き出しは終了しているはずですよ。
(システムのキャッシュには残っているかもしれませんが)
FBusy := True;
lst.SaveToFile(・・・);
FBusy := False;
等としておいて
フォームのOnCloseQueryでFBusyの判定をしてみては?
スレッド等を使って複雑な処理をしている場合は別ですが、
TStringListのSaveToFile()の実行中は他の処理(終了含む)が割り込むことは出来ません。
原因は他にあると思われます。
貴重な情報をありがとうございました。
ノートPCの省電力モードのみで発生する事象なので、
Delphiには関係のない部分が原因かも知れません。
探求してみたいと思います。
解決されてますが・・・以下はどうでしょうか?
ファイルサイズを監視して、不変になれば完全に作成されたと判断してます。
var
SearchRec: TSearchRec;
boFileMakeDone: Boolean;
lwFileSize: Longword;
saFileName: AnsiString;
begin
lwFileSize := 0;
boFileMakeDone := False;
while not boFileMakeDone do begin
FindFirst(saFileName, faAnyFile, SearchRec);
try
if (lwFileSize <> Longword(SearchRec.Size)) or (lwFileSize = 0) then begin
lwFileSize := SearchRec.Size; //ファイルサイズ取得
sleep(100); //ちょっと待つ
end else
boFileMakeDone := True; //ファイルが完全に作成された
finally
FindClose(SearchRec);
end;
end;
end;
追加アドバイス、ありがとうございます。
まだ試してはいないのですが、「サイズを見ないとダメなのかな?」
などと考えていたため、大変参考になりました。
もう少し時間を要するかもしれませんが、できれば顛末を書き込みたいと思います。
ありがとうございました。
ツイート | ![]() |