【问题标题】:Timers and Sleep on windowsWindows 上的定时器和睡眠
【发布时间】:2013-02-07 07:30:06
【问题描述】:

我正在尝试将一些使用nanosleep()get_clocktime() 的Linux 代码移植到Windows。据我所知,Windows 上确实没有那么多性能计时器,并且除了Sleep() 之外没有真正的睡眠功能。我在 Windows 上找到了 QueryPerformanceCounterQueryPerformanceFrequency,但我将如何调整它们以使用快速睡眠功能。我尝试移植的代码位于此 StackOverflow 帖子中:https://stackoverflow.com/a/13559213/1161270

总的来说,我正在尝试将 linux 代码移植到使用 nanosleep()get_clocktime()struct timespec 的 Windows,但似乎没有真正的等价物。我也对如何添加油门延迟的其他想法持开放态度。我已经阅读了PdhGetFormattedCounterArray() 函数,并且我有工作代码来监控计算机的输出带宽(以字节为单位),但我不确定如何使用这些数据来创建延迟以限制数据发送到特定 kb/ s 速度,更愿意使用链接帖子中提供的其他方法。

感谢您的宝贵时间。

【问题讨论】:

  • 你能 ping 到 NUL 延迟一段时间吗?
  • 我正在寻找一种高频定时/睡眠解决方案。 ping 将不起作用,毕竟Sleep() 以毫秒为单位计算不适用于我想要完成的工作。
  • 您是否尝试过使用睡眠?除非您使用的是千兆网络,否则一毫秒不到十几个正常大小的数据包,所以我不相信您真的需要超精细的分辨率。毕竟,您无法控制数据包的实际发送时间,它们最终可能会被缓冲并分组发送。另一种选择是忙等待,使用性能计数器来计算经过的时间,但是当你的线程被关闭时,你仍然会得到不稳定的间隙。
  • 是的,我已经尝试使用stuct timevalget_clocktime() 的移植版本(使用QueryPerformanceCounter)与睡眠一起移植此代码。这不是我预期的行为。我还尝试设置手动延迟,似乎如果我设置 Sleep(10) 我得到大约 30kb/s 的输出但是当我设置 Sleep(5) 根据我的带宽监视器我得到几乎超过 2mb/s(为什么我假设我需要 nanospeep 等)(我的连接仅以 60kb/s 的速度上传)。我还注意到性能计数器日志中的数据包分组。你能更好地解释一下你建议的忙等待方法吗?
  • 嗯,你不能使用持续睡眠,很明显。我注意到您引用的代码已经有一个 50 毫秒的窗口,所以睡眠通常会按照这个顺序。您需要做的就是更改计算以计算出休眠的毫秒数(而不是纳秒数),然后您就可以使用 Sleep。

标签: c windows bandwidth throttling


【解决方案1】:

请记住,大多数操作系统睡眠类型的 ACTUAL 精度通常以毫秒为单位(甚至是毫秒数)。看起来您可以睡眠更短的时间,但实际上,操作系统实际上并没有让进程进入睡眠状态,或者睡眠时间是“滴答”。对于 Linux(取决于内核配置)和 Windows 都是如此。

Microsoft 在这里解释了超时(Sleep 只是等待什么都没有发生的超时): http://msdn.microsoft.com/en-gb/library/windows/desktop/ms687069%28v=vs.85%29.aspx#waitfunctionsandtime-outintervals

【讨论】:

  • 在 Linux 上不是这样 - 使用启用“NOHZ”编译的现代内核(这需要具有高精度计时器的现代 CPU),以几十微秒的粒度睡眠是非常可实现的.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2011-01-25
  • 2021-10-22
  • 1970-01-01
  • 2011-11-22
  • 2011-12-22
相关资源
最近更新 更多