Миллисекундный режим функции Sleep()
хорошо описан и понятен.Это не делает ничего непредсказуемого.Иногда функцию обвиняют в непредсказуемости, т. Е. В возврате до истечения задержки.Я должен сказать, что это неправильно.Тщательное расследование подтвердит, что его поведение абсолютно предсказуемо.Единственная проблема в том, что об этом есть что почитать, и большинство из них - детское.Также часто говорят, что Windows это не ОС реального времени.Но такие комментарии ничего не дают, более того, такие комментарии используются, чтобы скрыть недостаток знаний.Меня немного раздражает, что даже Microsoft не замечает этого и не предоставляет лучшую документацию.
Однако, не преувеличивая этого небольшого ответа: функция sleep () точна, когда используется должным образом и когда знает еехарактеристики.Особое внимание должно быть уделено сну (0).Это очень мощный инструмент, особенно при использовании вместе с классом приоритета процесса, приоритетом потока, настройками мультимедиа-таймера и маской привязки процессора.
Таким образом, обычно настоящий сон может быть выполнен легко и безопасно вплоть до прерывания системыпериод.Когда речь идет о снах, которые короче, чем период прерывания, требуется вращение.Источник времени с более высоким разрешением должен использоваться для того, чтобы вращаться в течение более коротких периодов времени.Наиболее распространенным источником для этого является счетчик производительности.QueryPerformanceCounter(*arg)
обеспечивает увеличение * арг.QueryPerformanceFrequency(*arg)
обеспечивает частоту, с которой увеличивается счетчик производительности.Обычно это режим МГц и варьируется в зависимости от используемого оборудования.Частота в диапазоне МГц обеспечивает микросекундное разрешение.Таким образом, что-то с высоким разрешением может быть использовано для ожидания истечения желаемого промежутка времени.Тем не менее, к точности этого нужно подходить внимательно: ОС возвращает частоту счетчика производительности в виде константы.Это не верно!Поскольку частота генерируется физическим устройством, всегда существует смещение, и оно также не является постоянной величиной.Имеет термический дрейф.Более современные системы имеют меньший дрейф.Но если температурный дрейф составляет всего 1 стр / мин, ошибка будет 1 мкс / с.Смещение может легко составлять несколько 100. Смещение 100 в 1 МГц соответствует 100 мкс / с.
Если поток должен ждать какое-то время с высоким разрешением, он должен создать поток службы.Оба потока должны совместно использовать именованное событие.Сервисный поток должен находиться в режиме ожидания до 1 периода прерывания до желаемой задержки в режиме ожидания, а затем вращаться на счетчике производительности в течение оставшейся микросекунды.Когда служебный поток достигает последнего времени, он устанавливает указанное событие и завершается.Вызывающий поток проснется, потому что он ожидал именованного события с помощью функции ожидания.
Сводка:
- Сон хорошо понят, но плохо документирован.
- Служебная нить может имитировать спящие с высоким разрешением.
- Подобная шина служебной нити может быть признана общесистемной службой.
- Точность счетчика производительности следует тщательно проверять.Требуется калибровка.
Более подробную информацию можно найти в Windows Timestamp Project