01 Timerイベントの発生頻度はMax18回/秒
日付を管理していなかったので、正確な記述日時がわかりません。
ので、サイト「猿頁」開設日としました。御了承ください。
検証環境 自作ATX(Cerelon500→600MHz/VT6X4/256MB)
Windows2000ProSP2/IE6.00Preview/VS6SP5/MSDN-Lib Jan,2001
本コンテンツは、旧「TimerコントロールのIntervalプロパティに「1」をセットしたのに、1ミリ秒ごとにTimerイベントが発生しない。」の加筆訂正版です。
当時とはマシン環境も変わってきましたし、単に私が間違っているだけの部分もありましたし。
まず、前振りとして前回の論旨。
Timerコントロールの発生間隔を設定するIntervalプロパティは、ミリ秒単位で設定できるよぅになっていますが、発生間隔のコントロールはミリ秒単位ではありません。
MSDNの[Visual Studio 6.0 ドキュメント]-[Visual Basicドキュメント]-[リファレンス]-[ランゲージリファレンス]-[プロパティ]-[I]-[Intervalプロパティ]には
タイマー(Timer)コントロールのTimerイベントが発生する時間間隔をミリ秒単位で設定します。値の取得も可能です。タイマーイベントプロシージャは、Intervalプロパティの設定時間が経過するたびに、繰り返し実行されます。
および同[Visual Studio 6.0 ドキュメント]-[Visual Basicドキュメント]-[プログラミングガイド]-[Visual Basicを使ってできること]-[Visual Basicの標準コントロールの使用]-[タイマーコントロールの使用]では、
Interval プロパティには、タイマー (Timer) コントロールを使ってプログラミングを行う際に考慮すべき、いくつかの制限があります。とあります。
- システムに負荷のかかるプログラム ループ、大量の計算処理、またはドライブ、ネットワーク、ポートへのアクセスが発生すると、Intervalプロパティに指定した時間間隔でTimerイベントが発生しない可能性があります。
- 時間間隔には、0から64,767までの値を指定することができます。つまり、最大値(約64.8秒)を指定しても、1分を大幅に超えることはありません。
- 指定した時間間隔は、正確に時間どおりに経過するとは限りません。正確性を確保するため、タイマーは、内部で蓄積時間を追っていくのではなく、必要なときにシステムクロックを調べます。
- システムは、1秒に18のクロック信号を発生させます。したがって、Intervalプロパティはミリ秒単位で指定されますが、実際の時間間隔の精度は、せいぜい18分の1秒です。
以上よりTimerイベントは1秒あたり18回、1000/18≒55.56秒おきに発生するって理解になります。
で、実際にそのへんを測るプログラムを組んで確認。
10秒ループさせて169回、170回、172回、169回、169回のプロシージャ実行回数、平均16.9回/秒となりました。
62.5ミリ秒(10秒回した場合、計算上では160回)では、最大よりも多い回数が出た、ってことになっちゃうので理屈に合いません。それよりも計測のロジックに取られる部分やマシンに常駐している他プロセスが足を引っ張って最高速が出なかったと考えるほうが自然ですね。
したがってまぁ当時の結論としては、
- 最大18回/秒というMSDNの記述を信じてもいいのではないか。
- 18回に届かなかった誤差分は計測ロジック部や常駐他プロセス分だろう。