【发布时间】:2013-02-07 07:30:06
【问题描述】:
我正在尝试将一些使用nanosleep() 和get_clocktime() 的Linux 代码移植到Windows。据我所知,Windows 上确实没有那么多性能计时器,并且除了Sleep() 之外没有真正的睡眠功能。我在 Windows 上找到了 QueryPerformanceCounter 和 QueryPerformanceFrequency,但我将如何调整它们以使用快速睡眠功能。我尝试移植的代码位于此 StackOverflow 帖子中:https://stackoverflow.com/a/13559213/1161270
总的来说,我正在尝试将 linux 代码移植到使用 nanosleep()、get_clocktime() 和 struct timespec 的 Windows,但似乎没有真正的等价物。我也对如何添加油门延迟的其他想法持开放态度。我已经阅读了PdhGetFormattedCounterArray() 函数,并且我有工作代码来监控计算机的输出带宽(以字节为单位),但我不确定如何使用这些数据来创建延迟以限制数据发送到特定 kb/ s 速度,更愿意使用链接帖子中提供的其他方法。
感谢您的宝贵时间。
【问题讨论】:
-
你能 ping 到 NUL 延迟一段时间吗?
-
我正在寻找一种高频定时/睡眠解决方案。 ping 将不起作用,毕竟
Sleep()以毫秒为单位计算不适用于我想要完成的工作。 -
您是否尝试过使用睡眠?除非您使用的是千兆网络,否则一毫秒不到十几个正常大小的数据包,所以我不相信您真的需要超精细的分辨率。毕竟,您无法控制数据包的实际发送时间,它们最终可能会被缓冲并分组发送。另一种选择是忙等待,使用性能计数器来计算经过的时间,但是当你的线程被关闭时,你仍然会得到不稳定的间隙。
-
是的,我已经尝试使用
stuct timeval和get_clocktime()的移植版本(使用QueryPerformanceCounter)与睡眠一起移植此代码。这不是我预期的行为。我还尝试设置手动延迟,似乎如果我设置Sleep(10)我得到大约 30kb/s 的输出但是当我设置Sleep(5)根据我的带宽监视器我得到几乎超过 2mb/s(为什么我假设我需要 nanospeep 等)(我的连接仅以 60kb/s 的速度上传)。我还注意到性能计数器日志中的数据包分组。你能更好地解释一下你建议的忙等待方法吗? -
嗯,你不能使用持续睡眠,很明显。我注意到您引用的代码已经有一个 50 毫秒的窗口,所以睡眠通常会按照这个顺序。您需要做的就是更改计算以计算出休眠的毫秒数(而不是纳秒数),然后您就可以使用 Sleep。
标签: c windows bandwidth throttling