请详解一下 GetTickCount() 函数的作用和用法!

fjy19820702 2005-01-07 12:27:54
请不要复制MSDN上的英文!
...全文
15722 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kugou123 2005-01-07
  • 打赏
  • 举报
回复
对于一般的实时控制,使用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;

  // 获得对应的时间值
kugou123 2005-01-07
  • 打赏
  • 举报
回复
在要求误差不大于1毫秒的情况下,可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。使用下面的编程语句,可以实现50毫秒的精确定时,其误差小于1毫秒。

  DWORD dwStart, dwStop;

  // 起始值和终止值

  dwStop = GetTickCount();

  while(TRUE)

  {

   dwStart = dwStop;

  // 上一次的终止值变成新的起始值

  // 此处添加相应控制语句

   do

   {

  dwStop = GetTickCount();

   } while(dwStop - 50 < dwStart);

  }
老夏Max 2005-01-07
  • 打赏
  • 举报
回复
一般用作定时相关的操作。GetTickCount() 返回开机以来经过的毫秒数,呵呵
oyljerry 2005-01-07
  • 打赏
  • 举报
回复
使用GetTickCount,前后相减

GetTickCount
This function returns the number of milliseconds since boot time.

DWORD GetTickCount (void);
Return Values
The returned DWORD is a count of system ticks (or milliseconds) since boot time.

Remarks
The returned value should be used only to calculate time relative to other values returned by GetTickCount. After it reaches the highest possible value, the value wraps to zero and begins incrementing again. The value does not indicate time-of-day. To use time-of-day values, implement OEMGetRealTime and other related functions.

GetTickCount need only be called for platforms using CPUs that do not have well-defined timer channels.

Requirements

Runs on Versions Defined in Include Link to
Windows CE OS 2.10 and later Mkfuncs.h



See Also
OEMGetRealTime, QueryPerformanceCounter

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧