GetTickCount()函数的作用和用法

来源:互联网 发布:linux打开u盘命令 编辑:程序博客网 时间:2024/05/21 21:59
DWORD GetTickCount(void);    

1) 定义

For Release configurations, this function returns the number of milliseconds since the device booted, excluding any time that the system was suspended. GetTickCount starts at 0 on boot and then counts up from there.

在Release版本中,该函数从0开始计时,返回自设备启动后的毫秒数(不含系统暂停时间)。

For Debug configurations, 180 seconds is subtracted from the the number of milliseconds since the device booted. This allows code that uses GetTickCount to be easily tested for correct overflow handling.

在Debug版本中,设备启动后便从计时器中减去180秒。这样方便测试使用该函数的代码的正确溢出处理。

Return Values
The number of milliseconds indicates success.

返回值:如正确,返回毫秒数。

Header: Winbase.h.
Link Library: Coredll.lib.

2) 应用

用来计算某个操作所使用的时间:   

  Start:=GetTickCount;      ...//执行耗时的操作      Stop:=GetTickCount;      TimeUsed:=(Stop-Start)/1000;     //使用了xxx秒

用来定时:  

void main() {  DWORD dwLast;  DWORD dwCurrent;  DWORD dwInterval = 1000;  dwLast = GetTickCount();  int i = 0;  while(true)     {        dwCurrent = GetTickCount();        if( dwCurrent - dwLast < dwInterval )        continue;         //your code to be executed when interval is elapsed        printf("dwLast,dwCurrent,diff:%d,%d,%d ",dwLast,dwCurrent,dwCurrent-dwLast);         //your code to determine when to break        if( i > 10 ) break;        i++;        dwLast = dwCurrent;        printf("Time is up!");        break;     }   getchar();      return;} 


对于一般的实时控制,使用GetTickCount()函数就可以满足精度要求,但要进一步提高计时精度,就要采用 QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数。这两个函数是VC提供的仅供 Windows   9X使用的高精度时间函数,并要求计算机从硬件上支持高精度计时器。


QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型为:   

  BOOL   QueryPerformanceFrequency(LARGE—INTEGER   *lpFrequency);   
  BOOL   QueryPerformanceCounter(LARGE—INTEGER   *lpCount);   

  数据类型LARGE—INTEGER既可以是一个作为8字节长的整型数,也可以是作为两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:   

  

   typedef union —LARGE—INTEGER     {        struct        {             DWORD   LowPart;   //   4字节整型数                  LONG  HighPart;   //   4字节整型数         };         LONGLONG  QuadPart;         //   8字节整型数     }LARGE—INTEGER;  

 

  在进行计时之前,应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。笔者在主频为266、300、333的三种PentiumⅡ机器上使用该函数,得到的时钟频率都是1193180Hz。接着,笔者在需要严格计时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。以下程序是用来测试函数Sleep(100)的精确持续时间。   

   LARGE—INTEGER   litmp;     LONGLONG   QPart1,QPart2;     double   dfMinus,   dfFreq,   dfTim;     QueryPerformanceFrequency(&litmp);     //   获得计数器的时钟频率     dfFreq   =   (double)litmp.QuadPart;     QueryPerformanceCounter(&litmp);     //   获得初始值     QPart1   =   litmp.QuadPart;     Sleep(100)   ;     QueryPerformanceCounter(&litmp);     //   获得终止值     QPart2   =   litmp.QuadPart;     dfMinus   =   (double)(QPart2   -   QPart1);     dfTim   =   dfMinus   /   dfFreq;     //   获得对应的时间值   

0 0