精确计时
2016-03-14 12:52
246 查看
通常,
如果是要精确计时,
需要和平台结合起来,
比如 Win下,
可以这样:
先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。下列代码实现1ms的精确定时:
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
do
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
}while(dfTim<0.001);
其定时误差不超过1微秒,精度与CPU等机器配置有关。
如果是要精确计时,
需要和平台结合起来,
比如 Win下,
可以这样:
先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经 历的精确时间。下列代码实现1ms的精确定时:
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
QueryPerformanceFrequency(&litmp);
dfFreq = (double)litmp.QuadPart;// 获得计数器的时钟频率
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;// 获得初始值
do
{
QueryPerformanceCounter(&litmp);
QPart2 = litmp.QuadPart;//获得中止值
dfMinus = (double)(QPart2-QPart1);
dfTim = dfMinus / dfFreq;// 获得对应的时间值,单位为秒
}while(dfTim<0.001);
其定时误差不超过1微秒,精度与CPU等机器配置有关。
相关文章推荐
- 一个简单的JSP+JavaBean web计算器
- IO 专题
- [leetcode] 296. Best Meeting Point 解题报告
- mysql
- CodeForces 618A Slime Combining
- C++中cos,sin,asin,acos这些三角函数操作的是弧度,而非角度,
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转
- 一般线性模型的最小二次方拟合方法
- 2.0新版本对数据结构进行了大幅修改:
- 化:尽量用memset将一个数组设置清零,而不是通过for循环逐个置0
- OpenCV学习笔记(2):Mat矩阵的初始化
- opencv子矩阵操作
- 顺序栈与链栈
- OpenCV基础-cvCloneImage、cvCopyImage和 cvCloneMat、cvCopyMat(2010-12-06 22:16:28)
- sss--OpenCV
- Eclipse 常用快捷键
- 百度地图Api 根据两个坐标点计算距离
- Spark:用Scala和Java实现WordCount
- Testin云測公布首份国内应用质量报告:半数APP平均启动时间不合格
- SRAM与SDRAM的区别