睡眠()或睡眠()有多准确

我正在尝试模拟按键和按键动作。

例如:2638毫秒。

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

你怎么知道它真的有用吗?

您不会使用此代码,因为准确地测量代码执行所需的时间是一项艰巨的任务。

要了解您的问题标题提出的问题(您应该一次提出一个问题……)所述function的准确性由操作系统决定。 在Linux上,系统时钟粒度为10ms,因此通过nanosleep()的定时进程暂停仅保证精确到10ms,即使这样,也不能保证在指定的时间内完全hibernate。 (见下文。)

在Windows上,可以更改时钟粒度以适应电源管理需求(例如,降低粒度以节省电池电量)。 有关hibernatefunction,请参阅MSDN的文档 。

请注意,使用Sleep()/ nanosleep()时,操作系统仅保证进程暂停将至少持续您指定的时间。 执行其他进程总是可以延迟恢复进程。

因此,上面代码发送的按键事件将比按键事件发送至少2.638秒,而不是更快的毫秒。 但事件可能会在2.7秒,2.8秒甚至3秒后发送。 (或者,如果实时进程占用了CPU并且在一段时间内没有放弃控制,那么很久以后。)

Sleep在标准Windows线程调度方面起作用。 它精确到大约20-50毫秒。

因此,对于依赖于用户体验的事物,它是可以的。 然而,这对于实时事物来说绝对不合适。

除此之外,还有更好的方法来模拟键盘/鼠标事件。 请参阅SendInput

当请求的延迟比下一次中断发生的剩余时间短时,sleep()函数将在所需的延迟之前返回。 但这仅指出您希望睡眠的时间比系统当前支持的时间短。 建议将多媒体定时器资源设置为更高的中断频率,以获得观察到的睡眠延迟与所需延迟的更好匹配。

以下主题中的注释:

如何在WinXP下获得准确的1ms计时器滴答

睡眠时间不到一毫秒

命令Sleep()将确保线程至少暂停作为参数给出的时间量。 操作系统不保证。 有关详细讨论,您可以参考以下文章如何在操作系统级别实现睡眠?