タイマーの設定について

[戻る]
ひろ [E-Mail] 2003/02/18(火) 13:48:36
すいませんが、タイマー精度について教えてください。

現在、1ms単位でのタイマ設定を行うために、マルチメディアタイマーを
起動し、タイマー計測を行うソフトを作成しております。

開発環境は、Windows98、VC++6.0です。

このソフトを、Windows95,NT4.0上で動かす分には問題なく動作するんですが、
何故か、Window2000とXP上ではうまく動作してくれません。

たとえば、100ms毎に何か処理を行うプログラムを次のようなコードで記述した場合、

---------------------------
DWORD start_time, end_time;

while(1) {
    start_time = timeGetTime();

    (ここに、処理を記述)

    end_time = timeGetTime() - start_time;
    while(end_time < 100) {
        end_time = timeGetTime() - start_time;
    }
}
---------------------------

Windows98(95、NT含む)上では、安定して100ms周期で処理が行われますが、
Windows2000では、109ms周期で処理が行われるようになります。

ちなみに、WindowsXP上でVisualC++を起動して、デバッグを行おうと思い試みましたが、
timeGetSystemTime()関数から得られるMMTIME構造体の数値の評価さえもできませんでした。

これは、タイマの精度に問題があるのでしょうか?
それとも、マルチメディアタイマーの使い方が間違えているのでしょうか?

よろしくお願いいたします。

2003/02/18(火) 15:10:45
MSDNの timeGetTimeのところにも書いてあるように、timeBeginPeriod や 
QueryPerformanceCounter といった辺りを調べてみてはいかがでしょうか。

ku 2003/02/18(火) 15:30:27
マルチメディアタイマーは使ったことがないのですが
コールバックの方式を使うのが良いのではないかな
タイマーの精度が必要なのにループさせては意味がないような気がしますし

下記のページが参考になりそうな感じです
C++Builder用だけど、解説として十分な感じです
http://www.ne.jp/asahi/nagoya/ahomaro/builder/cpb-028.html

もっと合うのが欲しければgoogleで検索するのが早いのではないかな

ひろ [E-Mail] 2003/02/18(火) 19:58:17
[[解決]]
下記、URLを参考にさせてもらい、QueryPerformanceCounterを
使用することで解決できました。

http://homepage2.nifty.com/DSS/VCPP/API/QueryPerformanceCounter.htm

ありがとうございました。

古いスレッドには追加発言できません。