Windows平台的计时器

Windows平台下,常用的计时器有两种:

1, TimeGetTime计时器,它可以提供毫秒级ms的计时。但这个精度对很多应用场合而言还是不够精确的。

例子:

#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "winmm")//告诉程序要链接winmm.lib,VC中路径:VC98-->lib-->winmm.lib
main()
{
DWORD t1, t2;
t1 = timeGetTime();
Sleep(50);
t2 = timeGetTime();
printf("Start Time:    %uμs\n", 1000*t1);
printf("End Time:      %uμs\n", 1000*t2);
printf("Lasting Time: %uμs\n",(1000*t2-1000*t1));
}
2,QueryPerformanceCount计数器

此计数器随系统的不同可以提供微秒级μs的计数,如果硬件里有定时器,它就会启动这个定时器,并且不断获取定时器。
这样的定时器精度,就跟硬件时钟的晶振一样精确的。当需要更高精度计时时就需要使用QUeryPerformanceCounter来查询定时器的计数值。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,

善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。

//Timer2.cpp 使用QueryPerformanceCounter函数(查询定时器的计数值,其时间跟频率有关,例如Frequency为25000000,则每计数一次消耗0.04μs)    

//编译行:CL timer3.cpp /link KERNEl32.lib

#include <windows.h>
#include <stdio.h>
main()
{
LARGE_INTEGER t1, t2, tf;
QueryPerformanceFrequency(&tf);
printf("Frequency: %u\n", tf.QuadPart);
QueryPerformanceCounter(&t1);
Sleep(50);
QueryPerformanceCounter(&t2);
printf("Start Time:    %u\n", 1000000*t1.QuadPart);
printf("End Time:      %u\n", 1000000*t2.QuadPart);
printf("Lasting Time: %uμs\n",(1000000*t2.QuadPart-1000000*t1.QuadPart)/tf.QuadPart);
}
   /////////////////////////////////执行结果//////////////////////////////////
       Frequency:     25000000               Frequency:     25000000
  ①Start Time:     401052736          ②Start Time:     3144881664     
       End Time:       2553536896             End Time:       3878562048
       Lasting Time: 49907 μs                  Lasting Time: 50881 μs
   ////////////////////////////////////////////////////////////////////////////
可见,TimeGetTime函数的精确度是到ms,一旦到达μs级位数则为零,而QueryPerformanceCounter函数则可精确到μs级。

你可能感兴趣的:(windows,timer,Integer,平台,图形)