winapi - 是否有相当于 nanosleep 的 Windows?

标签 winapi

Unix 有多种 sleep API(sleep、usleep、nanosleep)。我所知道的唯一用于 sleep 的 Win32 函数是 Sleep(),它以毫秒为单位。

我看到大多数 sleep ,即使是在 Unix 上,都会显着地向上取整(即:通常约为 10 毫秒)。我已经看到,在 Solaris 上,如果您以 root 身份运行,您可以获得 10 毫秒以下的 sleep 时间,而且我知道这在 HPUX 上也是可能的,前提是启用了细粒度计时器内核参数。 Windows 上是否有更细粒度的计时器?如果有,API 是什么?

最佳答案

可悲的事实是,对此没有好的答案。多媒体定时器可能是你能得到的最接近的——它们只允许你将周期设置为 1 毫秒,但是(感谢 timeBeginPeriod)它们实际上提供了大约 1 毫秒的精度,而大多数其他定时器只有大约 10-15 ms 作为规则。

还有很多其他候选人。乍一看,CreateWaitableTimerSetWaitableTimer可能看起来最接近,因为它们设置在 100 ns 内部。不幸的是,至少在我的测试中,您不能真正依赖于接近该分辨率的任何地方。从长远来看,它们可能确实提供了最好的可能性,因为它们至少可以让您指定小于 1 毫秒的时间,即使您目前无法依赖实现来提供(任何接近)该分辨率。
NtDelayExecution好像和SetWaitableTimer差不多除了它是无证的。除非您打算使用/测试未记录的函数,否则在我看来 CreateWaitableTimer/SetWaitableTimer仅在记录的基础上是更好的选择。

如果您使用线程池,您可以尝试使用 CreateThreadPoolTimerSetThreadPoolTimer相反。我还没有对它们进行足够的测试,无法确定它们真正提供的分辨率,但我并不特别乐观。

计时器队列( CreateTimerQueueCreateTimerQueueTimer 等)是 MS 推荐的多媒体计时器替代品,但(至少在我的测试中)它们并没有真正提供比 Sleep 更好的分辨率.

关于winapi - 是否有相当于 nanosleep 的 Windows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827062/

相关文章:

c++ - 检查是否可以删除驱动器

c++ - 如何计算位图大小?

c++ - 从 Window Rect 计算客户端大小和位置

c# - 如何在 Windows 应用程序的语言栏中将语言动态更改为日语

winapi - 我可以单独捕获 stdout/stderr 并保持原始顺序吗?

c - 此代码是否将毫秒返回到纪元时间的秒数

c++ - 使用Win32 API时,要使用哪些数据类型?

c++ - 最小化应用程序时停止播放声音和音量

卷的 CreateFileMapping() 失败

c++ - 如何在 C++ 上获取文件夹及其子文件夹名称和路径中的所有文件到字符串数组?