Подтвердить что ты не робот

Разрешение ожидания WaitForSingleObject

Когда я жду события без сигнализации с помощью функции WaitForSingleObject, я обнаружил, что в некоторых случаях вызов вернет WAIT_TIMEOUT меньше, чем указанный период таймаута. Простое переключение на вызов с тайм-аутом, установленным на 1000 мс, я видел возврат вызова в периоды до 990 мс (работает на WinXP). Я использую QueryPerformanceCounter, чтобы получить независимое измерение времени в системном такте, поэтому я не думаю, что дрифт часов скорее всего будет ответом.

Такое поведение не представляет для меня каких-либо практических проблем, но я хотел бы лучше понять это. Похоже, что он работает примерно с разрешением таймера. Предоставляет ли Microsoft дополнительную информацию о точности этой функции? Должен ли я ожидать большей точности в Vista?

4b9b3361

Ответ 1

Да, WaitForSingleObject использует разрешение таймера, он не использует таймер с высоким разрешением, например QueryPerformanceCounter.

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx, статья MSDN в разделе "Функции ожидания" распространяется на это:

Точность указанного тайм-аута интервал зависит от разрешения системные часы. Системные часы "тикает" с постоянной скоростью. Если интервал ожидания меньше, чем разрешение системных часов, ждать может тайм-аут меньше, чем указанный период времени. Если интервал ожидания превышает один тик, но меньше двух, ожидание может быть где-то между одним и двумя тиками, и т.д.

В этой статье также объясняется, как использовать timeBeginPeriod для увеличения разрешения системных часов - но это не рекомендуется.

Я могу придумать несколько причин. Во-первых, более высокое разрешение не требуется почти для всех случаев использования WaitForSingleObject. Использование таймера с высоким разрешением потребует, чтобы ядро ​​постоянно проводило опрос таймера (не выполнимо, так как код ядра не гарантированно всегда работает) или часто перепрограммировать его для генерации прерывания (поскольку может быть несколько WaitForSingleObjects и, скорее всего, только один программируемое прерывание).

С другой стороны, уже существует источник синхронизации, который постоянно обновляется с разрешением, которое более чем достаточно для WaitForSingleObject, SetWaitableTimer и Sleep.