Tips タイマー部品の精度について

 タイマー部品はその間隔を1ミリ秒単位で設定することができますが、その間隔を極端に短くすると時間がどんどん遅れてきます。
 これはWindowsのTimerコンポーネント側の問題で、実際にどのくらいの間隔にすればどれだけ遅れるのかは、処理の内容やWindowsOSのバージョンによって異なりますが、20ミリ秒以下に設定すると顕著になるようです。
 ラーメンタイマーやホームページ更新のようにインターバルの長い場合、誤差は気にならない程度ですが、それでも数日繰り返し続けると明らかに誤差が出ます。
 ゲームやマルチメディアのように速度が必要な処理では、間隔が10ミリ秒といったこともあり得ますが、現状のタイマー部品では難しいでしょう。


 次のサンプルでは、タイマー間隔を10ミリ秒に設定し、それを6000回繰り返すことで1分間を計測しようとしています。そして開始から終了までかかった秒数を計算すれば60秒(±1秒)となるはずです。ところが、筆者のPC(WindowsXP)では94秒(約1分半)もかかっています。

'***** サンプル *****
計算=0
タイマーAとはタイマー
タイマーAについて
  は10。 # 10ミリ秒
  時満ちた時
    計算=計算+1
    もし計算=6000ならば # 10ミリ秒*6000=1分
      タイマーAを停止。今を表示。 # 60秒後
今を表示。タイマーAを開始
'***** ここまで *****


 タイマー間隔を1秒に設定すると、正確に動作しました。

'***** サンプル *****
計算=0
タイマーAとはタイマー
タイマーAについて
  は1000。 # 1秒
  時満ちた時
    計算=計算+1
    もし計算=60ならば # 1秒*60=1分
      タイマーAを停止。今を表示。 # 60秒後
今を表示。タイマーAを開始
'***** ここまで *****



 Windowsでは、この問題を解決するために別途「timeGetTime」と「GetTickCount」というAPIが用意されています。「なでしこ」で正確なタイマーが必要な場合は、これらAPIを利用するか、「システム時間」を取得するなどの工夫が必要でしょう。

 いずれの方法でも、タイマー部品よりも正確な時刻を取得できますが、それでも全く誤差がないわけではありませんので、試行錯誤を重ねて最適なプログラムを組む必要がありますね。
最終更新:2008年10月28日 14:50