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

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

Multimediatimer API

Источник

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

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

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

Таймеры с очередями API

Моя следующая попытка использовала queud таймеры 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);

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

Измерение

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

Вопрос

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

Спасибо.

9
задан schoetbi 29 July 2010 в 09:32
поделиться

2 ответа

Не обращаясь к ОС реального времени, вы не можете ожидать, что ваша функция будет вызываться каждые 1 мс.

В Windows, которая НЕ является ОС реального времени (для Linux она аналогична), программа, которая многократно считывает текущее время с точностью до микросекунд и сохраняет последовательные различия в гистограмме, имеет непустую ячейку в течение> 10 мс. ! Это означает, что иногда у вас будет 2 мс, но вы также можете получить больше между звонками.

5
ответ дан 4 December 2019 в 23:38
поделиться

Вы можете попробовать выполнить timeBeginPeriod(1) при запуске программы и timeEndPeriod(1) перед выходом. Это возможно может повысить точность таймера.

0
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: