Вы не соглашаетесь с этим кодом, так как точное измерение времени, которое требуется для выполнения кода, является сложной задачей.
Чтобы задать вопрос, заданный вашим вопросом (вы должны действительно задать один вопрос за раз ...), точность указанных функций определяется операционной системой. В Linux размерность системных часов составляет 10 мс, поэтому время приостановки процесса через nanosleep() гарантируется только с точностью до 10 мс, и даже тогда не гарантируется спать точно в указанное вами время. (См. Ниже).
В Windows можно масштабировать тактовую частоту, чтобы удовлетворить потребности в управлении питанием (например, уменьшить степень детализации для экономии заряда аккумулятора). См. MSDN's documentation on the Sleep function.
Обратите внимание, что при использовании функции Sleep()/nanosleep() операционная система гарантирует, что приостановка процесса будет продолжаться до не менее, если вы укажете. Выполнение других процессов всегда может задержать возобновление вашего процесса.
Таким образом, событие блокировки, отправленное вашим кодом выше, будет отправлено не менее чем на 2.638 секунд позже, чем событие key-down, а не миллисекунда раньше. Но возможно, что событие будет отправлено на 2,7, 2,8 или даже на 3 секунды позже. (Или намного позже, если процесс в реальном времени захватил процессор и не отменил управление в течение некоторого времени.)
Частота переключения резьбы около 40 миллисекунд. Вы, как правило, выполняете по крайней мере каждые три нити переключения потоков. Итак, вы говорите об уменьшении дела на 120 мсек. Это измеряется на машине XP P4 HT пару лет назад и без изменения частоты переключения NT_Thread. – CodingBarfield