【问题标题】:Is a Windows Timer as accurate as Sleep()?Windows 计时器是否与 Sleep() 一样准确?
【发布时间】:2015-10-31 13:59:38
【问题描述】:

Sleep() 非常准确,比如我想睡10个小时:

Sleep(36000000); // sleep for 10 hours

我的线程将等待正好 10 个小时(加上 Windows 需要唤醒我的线程的时间,可以忽略不计)。

但是,由于Sleep() 会阻塞我的 UI 线程,所以我改用 Windows 计时器。那么 Windows 计时器是否与Sleep() 一样准确?也就是说,它会等待 10 个小时(加上我的窗口过程接收WM_TIMER 消息所需的时间)吗?

【问题讨论】:

  • 我认为sleep() 也会使用操作系统计时器来计算10 hours
  • 使用计划任务
  • @Haris “ 计算 10 小时”是什么意思,如果计算超过 10 小时,它会使用其他东西吗?
  • @James 让我重新表述一下,“...也将仅使用操作系统计时器来计算 10 hours”。
  • SleepSetTimer 都不会考虑系统休眠的时间。另一方面,scheduled task 确实如此。

标签: c winapi


【解决方案1】:

是的,Sleep()SetTimer() 下面的基本管道是相同的。你可以通过调用timeBeginPeriod() 看到一些东西,它会影响两者的准确性。它是时钟滴答中断处理程序,它对睡眠和计时器进行计数,并在准备好再次运行时安排线程。当系统时钟被时间服务器重新校准时,他们的睡眠/等待时间会被调整。

【讨论】:

  • 在 Windows XP 上,当设置为 1 毫秒模式 (timeBeginPeriod(1) 时,代码实际上以 1024 hz 运行,并且在每 125 毫秒周期内,出现三个双刻度周期(在记号 42、84、125),使用 128 个内部记号来产生 125 毫秒的周期。如果在这些双记号边界之一上,睡眠(1)可能需要将近 2 毫秒。我不了解 Windows Vista,但 Windows 7 及更高版本以真正的 1000 赫兹运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多