Использование регулярных старых timeGetTime()
делать времени не является надежным на многих для Windows операционных систем на основе , так как зернистость системы таймера может достигать 10-15 миллисекунд , что означает, что timeGetTime()
соответствует только 10-15 миллисекунд. [Обратите внимание, что высокая степень детализации происходит на операционных системах на базе NT , таких как Windows NT, 2000 и XP. Windows 95 и 98, как правило, иметь гораздо лучше детализацию, около 1-5 мс.]
Однако, если вы звоните timeBeginPeriod(1)
в начале вашей программы (и timeEndPeriod(1)
на конец), timeGetTime()
будет, как правило, с точностью до 1-2 миллисекунд, , и предоставит вам точную информацию о времени таймера .
Sleep()
ведет себя аналогичным образом; длина времени, Sleep()
на самом деле спит для идет рука об руку с зернистости timeGetTime()
, поэтому после вызова timeBeginPeriod(1)
раз, Sleep(1)
будет на самом деле сон в течение 1-2 миллисекунд, Sleep(2)
для 2-3, и так что (вместо спящего с шагом достигает 10-15 мс).
Для более точного определения времени (точность доли миллисекунды), вы вероятно, хотите, чтобы избежать использования сборки мнемонические RDTSC, потому что это трудно откалибровать; вместо этого используйте QueryPerformanceFrequency
и QueryPerformanceCounter
, которые являются с точностью до менее 10 микросекунд (0,00001 секунд).
Для простого времени, как timeGetTime и QueryPerformanceCounter работают хорошо, и QueryPerformanceCounter является , очевидно, более точным. Тем не менее, если вам нужно сделать какое-либо «синхронизированные паузы» (например, те, которые необходимы для фреймрейта ограничения), вы должны быть осторожны, чтобы сидеть в петле вызывающей QueryPerformanceCounter, ожидая того, чтобы достичь определенного стоимость; это будет съедать 100% вашего процессора. Вместо этого рассмотрит гибридную схему, , где вы называете Sleep (1) (не забудьте timeBeginPeriod (1) первым!) Всякий раз, когда вам нужно пройти более 1 мс времени, а затем ввести только QueryPerformanceCounter 100% -сильная петля , чтобы закончить последние < 1/1000-й из второй необходимой задержки. Это даст вам сверхточную задержку (с точностью до 10 микросекунд), с очень минимальным использованием ЦП. См. Код выше.
Пожалуйста, избегайте timeBeginPeriod(); это влияет на системный планировщик и может вызвать проблемы с энергосбережением. – MSalters 2008-09-26 13:03:04