2010-11-08 175 views
2

我试图模拟一个按键和按键动作。睡眠()或睡眠()的准确程度

例如:2638毫秒。

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

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

+0

线程切换频率约为40毫秒。您的线程通常至少每3个线程切换滴答执行一次。所以你说的是120ms秒percision最糟糕的情况。 这是在几年前在XP机器P4 HT上测量的,并且没有改变NT_Thread开关频率。 – CodingBarfield 2011-02-01 13:01:29

回答

1

Sleep按标准Windows线程调度工作。精确到20-50毫秒左右。

因此,对用户体验依赖的事情来说没关系。然而,这对于实时的事情是绝对不合适的。

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

5

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

要解决问题标题所带来的问题(您应该一次提问一个问题......)所述功能的准确性由操作系统决定。在Linux上,系统时钟粒度为10毫秒,所以通过nanosleep()暂停的过程暂停时间只能保证精确到10毫秒,即使如此,也不能保证在您指定的时间内完全睡眠。 (见下文)

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

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

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

+5

“操作系统只保证暂停过程至少持续到您指定的时间。”在Windows上,这实际上并不正确。从您发布的MSDN链接中获得:“该线程可能会睡眠时间少于指定的时间长度”。 – user200783 2010-11-08 22:58:01

+0

好点,不知何故,我错过了...我会假设线程可能会睡眠时间不少于所需时间减去当前时钟粒度,但我找不到任何文档。 – cdhowie 2010-11-08 23:09:16

+1

最近几年(最近几年)带有NOHZ选项的Linux内核没有任何最小粒度,除了硬件自身强加的粒度之外。 – caf 2010-11-08 23:45:14

0

当请求的延迟时间比所需时间短时,sleep()函数将返回所需的延迟时间发生下一个中断。但是这只能指出你想睡的时间比目前系统支持的时间短。建议将多媒体计时器资源设置为更高的中断频率,以获得观察到的睡眠延迟与所需延迟的更好匹配。

中下面的线程的意见:)

How to get an accurate 1ms Timer Tick under WinXP

Sleep Less Than One Millisecond

0

命令休眠(将确保线程被挂起至少被给予作为参数的时间量。操作系统不保证它。有关详细的讨论,您可以参考下面的帖子 how is sleep implemented at OS level?