おいちゃんのおぼえがき

仕事のTipsをメモするブログ

MMTIMERの代わりに・・・

2011-08-26 | Win
Windows で高精度のタイマ割り込みを使うには、VC++/Win32 または MFC で MultiMediaTimer を使うと思っていたが、最近は CreateTimerQueue というのを使うらしい・・・。
こんな感じ。
詳しくは MSDN でも。以下はMSDNに載ってた例。こんなの勝手に転載すると怒られるのかな?

#include <windows.h>
#include <stdio.h>

HANDLE gDoneEvent;

VOID CALLBACK TimerRoutine(PVOID lpParam, BOOLEAN TimerOrWaitFired)
{
  if (lpParam == NULL)
  {
    printf("TimerRoutine lpParam is NULL\n");
  }
  else
  {
    // lpParam points to the argument; in this case it is an int

    printf("Timer routine called. Parameter is %d.\n",
          *(int*)lpParam);
  }

  SetEvent(gDoneEvent);
}

int main()
{
  HANDLE hTimer = NULL;
  HANDLE hTimerQueue = NULL;
  int arg = 123;

  // Use an event object to track the TimerRoutine execution
  gDoneEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  if (NULL == gDoneEvent)
  {
    printf("CreateEvent failed (%d)\n", GetLastError());
    return 1;
  }

  // Create the timer queue.
  hTimerQueue = CreateTimerQueue();
  if (NULL == hTimerQueue)
  {
    printf("CreateTimerQueue failed (%d)\n", GetLastError());
    return 2;
  }

  // Set a timer to call the timer routine in 10 seconds.
  if (!CreateTimerQueueTimer( &hTimer, hTimerQueue,
      (WAITORTIMERCALLBACK)TimerRoutine, &arg , 10000, 0, 0))
  {
    printf("CreateTimerQueueTimer failed (%d)\n", GetLastError());
    return 3;
  }

  // TODO: Do other useful work here

  printf("Call timer routine in 10 seconds...\n");

  // Wait for the timer-queue thread to complete using an event
  // object. The thread will signal the event at that time.

  if (WaitForSingleObject(gDoneEvent, INFINITE) != WAIT_OBJECT_0)
    printf("WaitForSingleObject failed (%d)\n", GetLastError());

  CloseHandle(gDoneEvent);

  // Delete all timers in the timer queue.
  if (!DeleteTimerQueue(hTimerQueue))
    printf("DeleteTimerQueue failed (%d)\n", GetLastError());

  return 0;
}