2010-11-08 2 views
2

Я пытаюсь имитировать действие клавиш и клавиш.Насколько точны Sleep() или sleep()

Например: 2638 millseconds.

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

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

+0

Частота переключения резьбы около 40 миллисекунд. Вы, как правило, выполняете по крайней мере каждые три нити переключения потоков. Итак, вы говорите об уменьшении дела на 120 мсек. Это измеряется на машине XP P4 HT пару лет назад и без изменения частоты переключения NT_Thread. – CodingBarfield

ответ

1

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

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

Кроме того, есть намного лучшие способы имитации событий клавиатуры и мыши. См. SendInput.

5

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

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

В Windows можно масштабировать тактовую частоту, чтобы удовлетворить потребности в управлении питанием (например, уменьшить степень детализации для экономии заряда аккумулятора). См. MSDN's documentation on the Sleep function.

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

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

+5

«ОС только гарантирует, что приостановка процесса будет продолжаться, по крайней мере, до тех пор, пока вы укажете». В Windows это на самом деле не так. Из опубликованной вами ссылки MSDN: «поток может спать меньше заданного времени». – user200783

+0

Хорошо, как-то я пропустил это ... Я бы предположил, что поток может спать не менее запрошенного времени минус текущая синхронизация часов, но я не могу найти никакой документации по этому вопросу. – cdhowie

+1

Последние (последние пару лет) Ядра Linux с опцией NOHZ не имеют минимальной детализации, отличной от той, которая накладывается самим аппаратным обеспечением. – caf

0

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

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

How to get an accurate 1ms Timer Tick under WinXP

Sleep Less Than One Millisecond

0

Команда Sleep() будет гарантировать, что нить подвешена по крайней мере, количество времени, которое дается в качестве аргумента. Операционная система не гарантирует этого. Подробное обсуждение вы можете найти ниже: how is sleep implemented at OS level?