- ベストアンサー
Windows2000上でのVCソフト作成時に日付が前後する現象が生じる
- Windows2000上でVCを使用してソフトを作成していますが、処理経過の確認のために保存しているログファイルで、日付が前後する現象が発生しています。経過時間を確認している箇所で問題が生じているため、対処方法を探しています。
- 使用している関数は、時間取得のためのtime(&now_t)と時間差取得のためのdifftime(now_t, m_BaseTime)です。ソフトは複数のスレッドを起動し、ログファイルに保存していますが、クリティカルセクションで競合が発生しないように配慮しています。
- 異常ログの具体例として、A07からB01に移行する際に時間が戻っている現象があります。ログの保存内容からは、A01~B03の並びは時系列で正常に保存されています。この問題に対して対処方法を探しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
いろいろと可能性は考えられます。 例えばこういうタイミングで動作している可能性はありませんか? A01 ____~~~~~~~~~~~~~~~~~~____ ...........time()...difftime() B01 _~~~_________________~~~___ ........time().............difftime() 固定幅フォントでないとうまく見えませんが、 time()とdifftime()の間に他のスレッドの time(),difftime()が動く可能性があるということです。 あと、マルチスレッド対応のライブラリを使用していますよね? 後は、何かグローバルな変数かスタティックな変数使っていて問題起こしているかとか。 それとログですが、こういう場合は専用のログ出力スレッドを作成し、 他のスレッドはログスレッドへメッセージなどのスレッド間通信で行うのが堅実な手です。
その他の回答 (2)
- tatsu99
- ベストアンサー率52% (391/751)
ログ出力は、個々のスレッドで行っているのしょうか。 1つの共通関数(ログ出力関数)を作成し、個々のスレッドが、それをよびだすようにしては、いかがですか。 ログ出力の間は、クリティカルセッションとし、その関数の中で、ログ出力時間を取得するようにすれば、上記の問題は発生しないと思いますが。(ただ、今回の場合はあまりに時間がかけ離れているので、#1のかたが指摘されていることが原因なのかも知れません) 尚、ログ出力時にその関数の中で、毎回ログファイルをオープン&クローズすれば、さらに確実かとおもいます。但し、クリティカルセッションの中でのオープン&クローズで、パフォーマンス上問題が発生するようでしたら、だめですが・・・・
お礼
回答いただきありがとうございます。 ログファイル保存方式を見なおしてみます。 ありがとうございました。
- ymmasayan
- ベストアンサー率30% (2593/8599)
ログがスレッドごとにバッファーリングされていて スレッド終了で一度に書き出されているのではないでしょうか。
お礼
早速回答いただきありがとうございます。 スレッドの動きなどを再検討してみます。 ありがとうございました。
お礼
回答いただきありがとうございます。 スレッドの動作を更に深く調査してみようと思います。 また、ログ出力専用スレッドは有効と思われますので 更に検討してみます。 ありがとうございました。