GetTickCount()とtimeGetTime()の精度に続き、今回はタイマー(WM_TIMERメッセージ)の精度を測ってみます。本などではWindowsのタイマー精度は約55msとされていますが、実際はどうなのか調べてみましょう。
精度の測定
測定方法は前回と同様ある一定の周期を設定し、その周期を指定したタイマーを起動してタイマーメッセージを100回処理します。周期の設定は10〜120msの10ms単位としました。リストボックスで周期を設定して、Timerボタンをクリックすると以下のメッセージ処理が行われタイマーメッセージを100回処理するのに要した時間を測ります。
case 0: /* Timerボタン */
EnableWindow(hwTimerB,FALSE);
/* 周期設定 */
dwInt=SendMessage(hwIntL,LB_GETCURSEL,0,0);
/* 開始時間を保存 */
dwStart=timeGetTime();
dwCount=0;
/* タイマーセット */
SetTimer(hwnd,1,(dwInt+1)*10,NULL);
/* タイマ−メッセージが100回処理されるまで待つ */
while (dwCount<100) {
if(GetMessage (&msg,NULL,0,0)==0)
break;
TranslateMessage(&msg);
DispatchMessage(&msg); /* メッセージ処理 */
}
KillTimer(hwnd,1); /* タイマーストップ */
/* 結果表示 */
wsprintf(lpszStr,"経過時間%dms",timeGetTime()-dwStart);
MessageBox(hwnd,lpszStr,"終了",MB_OK);
EnableWindow(hwTimerB,TRUE);
break;
タイマーメッセージの処理では、タイマの処理回数を数える変数dwCountを増やして行きます。
case WM_TIMER: // タイマーメッセージの処理
dwCount++;
break;
プログラム
「Timer」ボタンをクリックするとリストボックスで指定された周期で100回タイマメッセージを処理し、処理にかかった時間を表示します。
私の環境で測ると、10〜50msでは5600〜6000ms、60〜110msでは11000msぐらい時間がかかりますので、タイマーの精度はほぼ55ms程度みたいですね。PC-9821Xa9/C8とWindows95の組み合わせで測ると、25ms程度とやや精度が高いようです。
なお、測定中はプログラムを終了させないでください。