Насколько точным является Sleep () или sleep () - PullRequest
3 голосов
/ 09 ноября 2010

Я пытаюсь смоделировать нажатие клавиши и действие клавиши вверх.

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

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

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

Ответы [ 4 ]

5 голосов
/ 09 ноября 2010

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

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

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

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

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

1 голос
/ 09 ноября 2010

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

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

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

0 голосов
/ 17 марта 2014

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

0 голосов
/ 13 июля 2012

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

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

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

Сон менее одной миллисекунды

...