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

本文详细介绍了在Windows系统中实现高精度定时的两种方法:使用QueryPerformanceFrequency与QueryPerformanceCounter函数进行精确定时,以及利用Sleep函数实现定时,尽管后者存在误差。同时,提供了具体的C语言代码示例,演示了如何获取CPU时钟频率、计算定时时间以及查询CPU计数以来的时间。

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HHT0506

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值