项目场景:
在实际项目中,经常会使用Sleep函数进行休眠。
问题描述:
在开发过程中,想要使用Sleep(1)休眠1ms,但是发现调用Sleep(1)后,实际的休眠时间大于1ms。
原因分析:
这是因为Windows并非是一个实时操作系统,由于线程调度机制,所以它的时间精度不是很高。
解决方案:
可以通过下面的方式将Sleep函数精度提升到1-2ms(注意,仍然达不到1ms):
// 使用timeBeginPeriod、timeEndPeriod所需要依赖的头文件和库
#include <Windows.h>
#include <MMSystem.h>
#pragma comment(lib, "winmm.lib")
timeBeginPeriod(1); // 设置精度为1毫秒
::Sleep(1); // 当前线程挂起一毫秒
timeEndPeriod(1); // 结束精度设置
如果还想进一步提升Sleep函数的精度,可以使用vs2013中的下列函数:
std::this_thread::sleep_for(std::chrono::nanoseconds(100));
经测试,发现nanoseconds()精度只能达到1.03ms左右(依旧达不到微秒级、纳秒级),但是比使用timeBeginPeriod()精度要高。