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

时间:2010-11-08 22:29:19

标签: c winapi sleep windows-xp-sp3

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

例如:2638毫秒。

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

你怎么知道它是否真的有效?

4 个答案:

答案 0 :(得分:5)

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

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

在Windows上,可以更改时钟粒度以适应电源管理需求(例如,降低粒度以节省电池电量)。请参阅MSDN's documentation on the Sleep function

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

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

答案 1 :(得分:1)

Sleep适用于标准Windows线程调度。它精确到20-50毫秒。

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

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

答案 2 :(得分:0)

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

以下主题中的评论:

How to get an accurate 1ms Timer Tick under WinXP

Sleep Less Than One Millisecond

答案 3 :(得分:0)

命令Sleep()将确保线程至少暂停作为参数给出的时间量。操作系统不保证。有关详细讨论,请参阅以下帖子 how is sleep implemented at OS level?