在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