Sleep()时间不是预期的,为何
Sleep()时间不是预期的,为什么?
Sleep(5)与Sleep(8)的结果都一样,都是16毫秒,为什么?
unsigned long uBegin = 0;
unsigned long uProIick = 0;
uBegin = GetTickCount();
cout<<uBegin<<endl;
Sleep(8);//这里Sleep(n),当n<16时,效果都一样
uProIick = GetTickCount();
cout<<uProIick<<endl;
uProIick -= uBegin;
cout<<uProIick<<endl;//这里Sleep(n),当n<16时,效果都一样,这里的uProIick都是16
请高手解答,谢谢。
------解决方案--------------------
Sleep只能保证Sleep的时间大于指定的时间,因为线程之间存在切换,可能睡过头了。
说白了就是精度问题,使用核心对象WaitForSingleObject,会等待指定的时间,精度更高。
------解决方案--------------------
windows下的时钟不是以毫秒为单位的,sleep和timer其实都一样,精度好像是55毫秒,所以你sleep(5)和8其实没差别,都在误差范围内
------解决方案--------------------
≈15ms
------解决方案--------------------
长知识了~
------解决方案--------------------
Sleep没有那么精确
------解决方案--------------------
50毫秒以上试试
------解决方案--------------------
Sleep 精度在16ms左右
------解决方案--------------------
这与系统提供的时间粒度和线程调度有关。
因为windows提供不了5ms这么小的时间粒度,所以只能向上取整了。这就好比你的同学叫你1.5秒之后发一个文件给他,但你的电脑最小的时间单位是秒。那么你为了确保不过早发送文件,只能看着电脑的时间过去了2秒才会发送文件。
windows是多任务的。当你调用sleep睡眠后,过了睡眠时间,windows应该去唤醒你。但此时windows还可能在忙着其他事件,来不及唤醒你。这种情况一般发生在系统繁忙的时间。
Sleep(5)与Sleep(8)的结果都一样,都是16毫秒,为什么?
unsigned long uBegin = 0;
unsigned long uProIick = 0;
uBegin = GetTickCount();
cout<<uBegin<<endl;
Sleep(8);//这里Sleep(n),当n<16时,效果都一样
uProIick = GetTickCount();
cout<<uProIick<<endl;
uProIick -= uBegin;
cout<<uProIick<<endl;//这里Sleep(n),当n<16时,效果都一样,这里的uProIick都是16
请高手解答,谢谢。
------解决方案--------------------
Sleep只能保证Sleep的时间大于指定的时间,因为线程之间存在切换,可能睡过头了。
说白了就是精度问题,使用核心对象WaitForSingleObject,会等待指定的时间,精度更高。
------解决方案--------------------
windows下的时钟不是以毫秒为单位的,sleep和timer其实都一样,精度好像是55毫秒,所以你sleep(5)和8其实没差别,都在误差范围内
------解决方案--------------------
≈15ms
------解决方案--------------------
长知识了~
------解决方案--------------------
Sleep没有那么精确
------解决方案--------------------
50毫秒以上试试
------解决方案--------------------
Sleep 精度在16ms左右
------解决方案--------------------
这与系统提供的时间粒度和线程调度有关。
因为windows提供不了5ms这么小的时间粒度,所以只能向上取整了。这就好比你的同学叫你1.5秒之后发一个文件给他,但你的电脑最小的时间单位是秒。那么你为了确保不过早发送文件,只能看着电脑的时间过去了2秒才会发送文件。
windows是多任务的。当你调用sleep睡眠后,过了睡眠时间,windows应该去唤醒你。但此时windows还可能在忙着其他事件,来不及唤醒你。这种情况一般发生在系统繁忙的时间。