Я пытаюсь вызвать функцию каждый 1 мс. Проблема, мне нравится делать это с окнами. Таким образом, я попробовал multimediatimer API.
Источник
idTimer = timeSetEvent(
1,
0,
TimerProc,
0,
TIME_PERIODIC|TIME_CALLBACK_FUNCTION );
Мой результат состоял в том, что большую часть времени 1 мс был в порядке, но иногда я получаю двойной период. Посмотрите небольшой удар в multimediatimerHistogram http://www.freeimagehosting.net/uploads/8b78f2fa6d.png приблизительно на 1,95 мс
Моя первая мысль была то, что, возможно, мой метод работал слишком долго. Но я уже измерил это и дело было не так.
Моя следующая попытка использовала 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.
Таким образом, теперь мой вопрос состоит в том, если кто-то встретился с подобными проблемами под окнами и возможно даже нашел решение?
Спасибо.
Не обращаясь к ОС реального времени, вы не можете ожидать, что ваша функция будет вызываться каждые 1 мс.
В Windows, которая НЕ является ОС реального времени (для Linux она аналогична), программа, которая многократно считывает текущее время с точностью до микросекунд и сохраняет последовательные различия в гистограмме, имеет непустую ячейку в течение> 10 мс. ! Это означает, что иногда у вас будет 2 мс, но вы также можете получить больше между звонками.
Вы можете попробовать выполнить timeBeginPeriod(1) при запуске программы и timeEndPeriod(1)
перед выходом. Это возможно может повысить точность таймера.