タイマー(WM_TIMER)の精度

GetTickCount()とtimeGetTime()の精度に続き、今回はタイマー(WM_TIMERメッセージ)の精度を測ってみます。本などではWindowsのタイマー精度は約55msとされていますが、実際はどうなのか調べてみましょう。

精度の測定

測定方法は前回と同様ある一定の周期を設定し、その周期を指定したタイマーを起動してタイマーメッセージを100回処理します。周期の設定は10120ms10ms単位としました。リストボックスで周期を設定して、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回タイマメッセージを処理し、処理にかかった時間を表示します。

私の環境で測ると、1050msでは56006000ms60110msでは11000msぐらい時間がかかりますので、タイマーの精度はほぼ55ms程度みたいですね。PC-9821Xa9/C8とWindows95の組み合わせで測ると、25ms程度とやや精度が高いようです。

プログラムソース表示

なお、測定中はプログラムを終了させないでください。


プログラミング資料庫 > Windowsプログラミング研究室