dポイントプレゼントキャンペーン実施中!

Windows2000上でVCを使用してソフトを作成しています。(MFCベース)
処理経過を確認するためにログファイルを保存し、この中にはログを落とす際の日付と現象を保存しています。ここで、日付が前後する現象が発生していることがわかりました。このため経過時間を確認して処理を行っている箇所で、問題が生じています。何か対処方法はないでしょうか。よろしくお願いします。

 使用している関数:
  時間取得・・・time(&now_t);
  時間差取得・・・double t = difftime(now_t, m_BaseTime);

 ソフト構成:
  いくつかのスレッドを起動し、各スレッドより同一
 のログファイルに保存しています。但し、この際、
 クリティカルセクションで競合が発生しないように
 配慮しているつもりです。

 異常ログの具体例:
  A07からB01に移行する際に、10分から
 9分に時間が戻っているような感じです。またログ
 保存している現象の内容からは、A01~B03の
 並びは時系列となっており、現象自体は正常な順序で
 保存されています。
  
2004年04月06日 04時09分59.463秒 A01

2004年04月06日 04時10分00.114秒 A02
2004年04月06日 04時10分03.118秒 A03
2004年04月06日 04時10分03.318秒 A04
2004年04月06日 04時10分03.549秒 A05
2004年04月06日 04時10分03.559秒 A06
2004年04月06日 04時10分03.869秒 A07

2004年04月06日 04時09分08.635秒 B01
2004年04月06日 04時09分08.645秒 B02
2004年04月06日 04時09分08.645秒 B03

 以上分かり難い説明と思いますが、よろしくお願い致します。

A 回答 (3件)

いろいろと可能性は考えられます。



例えばこういうタイミングで動作している可能性はありませんか?


A01 ____~~~~~~~~~~~~~~~~~~____
...........time()...difftime()


B01 _~~~_________________~~~___
........time().............difftime()


固定幅フォントでないとうまく見えませんが、
time()とdifftime()の間に他のスレッドの
time(),difftime()が動く可能性があるということです。

あと、マルチスレッド対応のライブラリを使用していますよね?

後は、何かグローバルな変数かスタティックな変数使っていて問題起こしているかとか。

それとログですが、こういう場合は専用のログ出力スレッドを作成し、
他のスレッドはログスレッドへメッセージなどのスレッド間通信で行うのが堅実な手です。
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
スレッドの動作を更に深く調査してみようと思います。
また、ログ出力専用スレッドは有効と思われますので
更に検討してみます。
ありがとうございました。

お礼日時:2004/04/13 20:23

ログ出力は、個々のスレッドで行っているのしょうか。


1つの共通関数(ログ出力関数)を作成し、個々のスレッドが、それをよびだすようにしては、いかがですか。
ログ出力の間は、クリティカルセッションとし、その関数の中で、ログ出力時間を取得するようにすれば、上記の問題は発生しないと思いますが。(ただ、今回の場合はあまりに時間がかけ離れているので、#1のかたが指摘されていることが原因なのかも知れません)
尚、ログ出力時にその関数の中で、毎回ログファイルをオープン&クローズすれば、さらに確実かとおもいます。但し、クリティカルセッションの中でのオープン&クローズで、パフォーマンス上問題が発生するようでしたら、だめですが・・・・
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
ログファイル保存方式を見なおしてみます。
ありがとうございました。

お礼日時:2004/04/13 20:13

ログがスレッドごとにバッファーリングされていて


スレッド終了で一度に書き出されているのではないでしょうか。
    • good
    • 0
この回答へのお礼

早速回答いただきありがとうございます。
スレッドの動きなどを再検討してみます。
ありがとうございました。

お礼日時:2004/04/13 12:56

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