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程度とやや精度が高いようです。
なお、測定中はプログラムを終了させないでください。