Как получить точный тик таймера 1 мс под WinXP

Я пытаюсь вызывать функцию каждые 1 мс. Проблема в том, что мне нравится делать это с Windows. Поэтому я попробовал мультимедийный API.

Мультимедийный API

Источник

idTimer = timeSetEvent( 
     1, 
     0,
     TimerProc, 
     0, 
     TIME_PERIODIC|TIME_CALLBACK_FUNCTION ); 

Мой результат состоял в том, что большую часть времени 1 мс была в порядке, но иногда я получаю двойной период. Увидеть небольшой удар в 1.95 мсmultimediatimerHistogram http://www.freeimagehosting.net/uploads/8b78f2fa6d.png

Моей первой мыслью было, что, возможно, мой метод работал слишком долго. Но я уже измерил это, и это было не так.

API очереди по таймеру

Моей следующей попыткой было использование API таймеров очереди с

hTimerQueue = CreateTimerQueue();
if(hTimerQueue == NULL)
{
printf("Error creating queue: 0x%x\n", GetLastError());
}

BOOL res = CreateTimerQueueTimer(
&hTimer, 
hTimerQueue, 
TimerProc, 
NULL, 
0, 
1,  // 1ms
    WT_EXECUTEDEFAULT);

Но и результат оказался не таким, как ожидалось. Теперь я получаю большую часть времени за 2 мс.queuedTimer http://www.freeimagehosting.net/uploads/2a46259a15.png

измерение

Для измерения времени я использовал метод QueryPerformanceCounter и QueryPerformanceFrequency.

Вопрос

Итак, теперь мой вопрос: сталкивался ли кто-нибудь с подобными проблемами под Windows и, возможно, даже нашел решение?

Благодарю.

Ответы на вопрос(3)

Ваш ответ на вопрос