プロが教えるわが家の防犯対策術!

WindowsのAPIについての質問です。
timeGetTimeの精度を上げるため、timeBeginPeriodを呼ぼうと思っています。ですが、timeBeginPeriodを呼んだが、timeEndPeriodを呼ばなかったり強制終了等で呼べなかったりした場合はどうなってしまうのでしょうか。
timeBeginPeriodはOS全体に影響するとのことなので、timeBeginPeriodを呼んだプログラムが終了すれば精度も元に戻るのであれば安心なのですが、ずっと残るとなると気になります。
そうだとすると、今作ろうとしているプログラムは、コンソールアプリケーションでタイマーで定期的に負荷をかけ続けるもので、Ctrl-Cで終了させることを前提にしているため、timeEndPeriodを呼ぶタイミングがなく困っています。

A 回答 (2件)

以下のプログラムを動かして実験してみました。


 XP SP3 , Intel Core 2 Duo E6850 (3.0GHz)

// <A>
int main()
{
 timeBeginPeriod(1);
}
// <B>
int main() {
 for (int i=0; i<10; i++) {
  printf("%d\n", timeGetTime());
  Sleep(1);
 }
}

1) <B>を単独で実行したとき
 →約15msおきの数値が表示されました。
2) <A>を実行した後<B>を実行したとき
 →約15msおきの数値が表示されました。
3) Windows Media Playerを起動しておいて<B>を実行したとき
 →約4msおきの数値が表示されました。

以上からtimeEndPeriodを呼ばすにプログラムを終了してもタイマー精度はリセットされるようです。
    • good
    • 0
この回答へのお礼

そうでしたか!
ということは、Ctrl-Cで終了時にtimeEndPeriodを呼ぶようにしなくても、精度はクリアされそうですね。
実験までしていただいてありがとうございました。
これで理解が進みました。

お礼日時:2009/09/20 21:38

SetConsoleCtrlHandlerについて調べるとよいでしょう。

    • good
    • 0
この回答へのお礼

なるほど!
プログラムが終了する前に呼んでもらう関数を登録しておけばよいのですね。今回のプログラムではそのように作ろうと思います。
後は、知識として、timeBeginPeriodを呼んだがtimeEndPeriodを呼ばずに終わってしまった場合にどうなってしまうのかを知っておきたいと思っています。
ありがとうございました。

お礼日時:2009/09/07 21:56

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