【源码及附件】如何利用QueryPerformanceFrequency()与QueryPerformanceCounter()实现计算机精确定时

在Windows中实现精确定时,可用QueryPerformanceFrequency()函数与QueryPerformanceCounter()函数,如下所示,其中QPart是CPU从某个事件起以dfFreq的频率累积计的数,这个事件可能是电脑开机以来,也可能是某次开机或装系统以来,我曾多次尝试输出,计算出世间,有时候数值达到几百小时,有时候几分钟,几分钟明显是开机以来的时间。这个数在开机时会一直增加,不会置零,所以QPart2-QPart1是两次查询事件的差值,差值除以频率即可得到精确时间。下面的程序运行结果是先输出CPU时钟频率,经过5.21秒输出dfTim的值5.210000。

#include"windows.h"
#include<stdio.h>
int main()
{
	LARGE_INTEGER  litmp;
	LONGLONG  QPart1,QPart2;
	double  dfFreq, dfTim=0,dfMinus;
	QueryPerformanceFrequency(&litmp); //查询电脑定时器的时钟频率,载入litmp的QuadPart中
	dfFreq = (double)litmp.QuadPart;//将时钟频率赋值给dfFreq
	QueryPerformanceCounter(&litmp);//查询电脑定时器已计的数,载入litmp的QuadPart中
	QPart1 = litmp.QuadPart;//将已计的数赋值给QPart1
	printf("%f\n", dfFreq);//打印出时钟频率
	while (dfTim < 5.21)//定时5.21秒
	{
		QueryPerformanceCounter(&litmp);
		QPart2 = litmp.QuadPart;
		dfMinus = QPart2 - QPart1;//计算两次查询的差值
		dfTim = dfMinus / (dfFreq);//时间=差值/频率,单位为秒
	};
	printf("%f\n", dfTim);//打印出要求的定时时间
	system("pause");
}


也可利用Sleep()实现定时,但这个定时不是很准,有误差,程序及运行结果如下

#include"windows.h"
#include<stdio.h>
int main()
{
	LARGE_INTEGER  litmp;
	LONGLONG  QPart1, QPart2;
	double  dfFreq, dfTim = 0, dfMinus;
	QueryPerformanceFrequency(&litmp); //查询电脑定时器的时钟频率,载入litmp的QuadPart中
	dfFreq = (double)litmp.QuadPart;//将时钟频率赋值给dfFreq
	QueryPerformanceCounter(&litmp);//查询电脑定时器已计的数,载入litmp的QuadPart中
	QPart1 = litmp.QuadPart;//将已计的数赋值给QPart1
	Sleep(1000);
	QueryPerformanceCounter(&litmp);
	QPart2 = litmp.QuadPart;
	dfMinus = QPart2 - QPart1;//计算两次查询的差值
	dfTim = dfMinus / (dfFreq);//时间=差值/频率,单位为秒
	printf("%f\n", dfTim);//打印出要求的定时时间
	system("pause");
}


查询CPU计数以来的时间程序。

#include"windows.h"
#include<stdio.h>
int main()
{
	LARGE_INTEGER  litmp;
	LONGLONG  QPart1;
	double  dfFreq, dfTim;
	QueryPerformanceFrequency(&litmp); //查询电脑定时器的时钟频率,载入litmp的QuadPart中
	dfFreq = (double)litmp.QuadPart;//将时钟频率赋值给dfFreq
	QueryPerformanceCounter(&litmp);//
	QPart1 = litmp.QuadPart;//获得初始值
	dfTim = QPart1 / (dfFreq*3600);//获得时间,单位小时	
	printf("%f\n%f\n", dfFreq,dfTim);
	system("pause");
}

参考文章:

https://blog.csdn.net/augusdi/article/details/10958277

https://www.cnblogs.com/sifenkesi/archive/2011/06/01/2065673.html

发布了34 篇原创文章 · 获赞 26 · 访问量 7619

猜你喜欢

转载自blog.csdn.net/HHT0506/article/details/100854744