怪事:Sleep(1)不再是1毫秒,何解?

#Page# 2014-05-08 11:28:37
各位i:
VS2010+Win7
之前的MFC程序在线程中延时使用Sleep(1)还是挺准的,现在拿出来重新编译,却发现很不准,特地新建了一个工程测试Sleep,也不准。
Sleep(10)还有点靠谱,Sleep(1)相当不准:
以前用下面的来延时1秒,还过得去
i=0;
while(i<1000){
Sleep(1);
i++;
}
这两天编译后居然耗费10多秒,改成
i=0;
while(i<100){
Sleep(10);
i++;
}
还凑合,也会有个1秒多的误差,这个怎么解析?
...全文
869 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuankuan_qiao 2014-05-08
  • 打赏
  • 举报
回复
发CPU心跳
#Page# 2014-05-08
  • 打赏
  • 举报
回复
楼上说的我都知道,不需要非常准确,关键不能差10几秒。问题是:以前是OK的,现在不OK,大概有什么因素?我感觉除了日期改变,其他都没改变。 为什么不sleep(1000)是因为循环里面要读取buffer,如果失败会直接退出返回,而sleep(1000)的用户体验很不好。
china_119 2014-05-08
  • 打赏
  • 举报
回复
while比较需不需要时间?i++运算需不需要时间?你最终得到的延时效果是整体的while(..)这些代码运行时间的总成,而非单纯的一句Sleep所代表的,所以循环次数越多与你期望的延时时长误差就越大。。。
Jonix 2014-05-08
  • 打赏
  • 举报
回复
sleep是不准的 一般要取CPU运行的过期毫秒值计算时差
china_119 2014-05-08
  • 打赏
  • 举报
回复
直接写个Sleep(1000)不就是一秒了,不明白为什么要像你这样子写
洗洗睡去 2014-05-08
  • 打赏
  • 举报
回复
我试过 大概16ms一次 sleep1
zwfgdlc 2014-05-08
  • 打赏
  • 举报
回复
记得好像CPU中断速度默认是16MS,所以Sleep最小精度也应该是16MS. 如果你要提高精度可以用timeBeginPeriod()更改CPU最小中断速度
三条猫 2014-05-08
  • 打赏
  • 举报
回复
Sleep的精度是很低的,根本达不到1ms的等级。
Eleven 2014-05-08
  • 打赏
  • 举报
回复
精度要求比较高的话就用QueryPerformanceCounter、QueryPerformanceCounter吧
BeanJoy 2014-05-08
  • 打赏
  • 举报
回复
Sleep的作用是放弃本线程剩下的时间片,等待下一次指定的时间过了后CPU继续执行本线程相关代码。 Sleep(1)线程放弃本次剩下时间片,CPU执行其他线程。1毫秒后,本线程的状态变为准备运行,但是这并不意味着本线程会立即得到CPU资源继续运行,这需要等到CPU把其他线程都执行后,再次轮询到本线程,本线程才会继续执行。这个过程,耗时就不是1毫秒了,可能就和当前系统运行的线程个数等有关。 若要实现楼主这样的要求,应该这样用:

DWORD dwStart = :: GetTickCount();
while(::GetTickCount() - dwStart < 1000)
{
    Sleep(1);
}
在while中可进行你想要的操作,也可直接break。
向立天 2014-05-08
  • 打赏
  • 举报
回复
sleep这里的时间精度最小也就是10毫秒左右
lis2012 2014-05-08
  • 打赏
  • 举报
回复
你自己大概计算一下一个循环需要耗时多少,最后sleep的时候相应的减少一些就可以了

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧