在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"); }