Как получить точный тик таймера 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 и, возможно, даже нашел решение?
Благодарю.