Насколько точным является Sleep() или sleep()

Я пытаюсь смоделировать ключ вниз и ключ действия.

Например: 2638 миллисекунд.

SendMessage(hWnd, WM_KEYDOWN, keyCode, 0);
Sleep(2638);
SendMessage(hWnd, WM_KEYUP, keyCode, 0);

Как вы узнали бы, действительно ли это работает?

4 ответа

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

Чтобы перейти к вопросу, заданному названием вашего вопроса (вы должны задавать один вопрос за раз...), точность этих функций определяется операционной системой. В Linux гранулярность системных часов составляет 10 мс, поэтому гарантированное время приостановки процесса с помощью nanosleep() будет точно равным 10 мс, и даже в этом случае не гарантируется, что время ожидания будет точно в указанное вами время. (Увидеть ниже.)

В Windows гранулярность часов можно изменить в соответствии с потребностями управления питанием (например, уменьшить гранулярность для экономии заряда батареи). См . Документацию MSDN по функции Sleep.

Обратите внимание, что с Sleep()/nanosleep() ОС гарантирует только то, что приостановка процесса будет длиться как минимум столько, сколько вы укажете. Выполнение других процессов всегда может задержать возобновление вашего процесса.

Поэтому событие нажатия клавиши, отправленное с помощью указанного выше кода, будет отправлено как минимум на 2,638 секунды позже события нажатия клавиши, и не раньше, чем на миллисекунду. Но было бы возможно отправить событие через 2,7, 2,8 или даже через 3 секунды. (Или намного позже, если процесс в реальном времени захватил процессор и некоторое время не отказывался от управления.)

Sleep работает с точки зрения стандартного планирования потоков Windows. Это с точностью до 20-50 миллисекунд.

Так что это нормально для вещей, зависящих от опыта пользователя. Однако это абсолютно неуместно для вещей в реальном времени.

Помимо этого, есть гораздо лучшие способы для имитации событий клавиатуры / мыши. Посмотри пожалуйста SendInput,

Команда Sleep() гарантирует, что поток будет приостановлен, по крайней мере, на время, указанное в качестве аргумента. Операционная система не гарантирует этого. Для подробного обсуждения вы можете обратиться к следующему посту, как реализован режим сна на уровне ОС?

Функция sleep() вернется до желаемой задержки, если запрошенная задержка меньше времени, оставшегося до следующего прерывания. Но это только указывает на то, что вы хотите спать в течение более короткого периода времени, чем в настоящее время поддерживается вашей системой. Рекомендуется установить ресурс мультимедийного таймера на более высокую частоту прерывания для получения лучшего соответствия наблюдаемой задержки ожидания относительно желаемой задержки.

Комментарии в следующих темах:

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

Спать меньше одной миллисекунды

Другие вопросы по тегам