掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ログ出力について (ID:72956)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> もしかすると、これだけで仕様が満たせるかもしれません。 前提条件次第では満たせるかもしれないが、プロセス間同期取った方が良いように個人的には思う。 ファイルの共有モードを利用すれば > EXEが2つ以上起動したときに、対象のログファイルに同時に書き込まれるとファイルが壊れてしまいます。 は回避可能だが実装方法は > A、CreateFile を使ってopen/closeを繰り返す。 となり効率はよろしくない。また > (ロック解除を待つことは可能?) については「否」。for文内でCreateFileを繰り返し、他がログを開いていない時に(運良く)CreateFileを呼べればログ出力処理という形(↓)に多分なるので。 for (int i=0; i < 最大試行回数; ++i) { HANDLE file = ::CreateFile(*, GENERIC_WRITE, FILE_SHARE_READ, *, *, *, *); if (file != INVALID_HANDLE_VALUE) { // 開けたのでログ出力、ファイルサイズチェック処理等実行 : ::CloseHandle(file); break; // 終了 } else { // 他でログファイルが開かれているので開けなかった ::Sleep(100); // とりあえず0.1秒待ってから再試行してみる } } > ちゃんと全てのログが(プロセス単位で正しい順で) ログ出力機構を呼ぶスレッドが1つであれば「プロセス単位で正しい順で」は「for文内でCreateFile」だけでも可能だと思う。 ただ、複数スレッドからログ出力が行われる場合は(スレッド間同期でも取らないと)書き込む順番が前後する可能性がある。 # 其々が順番に並んで順次ログファイルアクセス権を取っていくのでは無く、アクセス権が空いた瞬間を狙って皆で一斉に奪い合う形の実装になるので。 # 先に挙げた CreateMutex + WaitForSingleObject だとプロセス間同期と共にスレッド間同期も取ってqueue処理されるので書き込む順番は維持される。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.