background image

  该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事

 

件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,
否则返回

NULL。函数的参数说明如下:

       uDelay

       

:以毫秒指定事件的周期。

Uresolution:以毫秒指定延时的

精度,数值越小定时器事件分辨率越高。缺省值为

1ms        

LpTimeProc:指

       

向一个回调函数。

DwUser

       

:存放用户提供的回调数据。

FuEvent:指

       

定定时器事件类型:

TIME_ONESHOT:uDelay 毫秒后只产生一次事件 

TIME_PERIODIC :每隔 uDelay

      

毫秒周期性地产生事件。

  具体应用时,可以通过调用

timeSetEvent()函数,将需要周期性执行的

任务定义在

LpTimeProc

 

回调函数 中

(如:定时采样、控制等),从而完成所需

处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在

 

定时器使用完毕后, 应及时调用

timeKillEvent()

 

将之释放。

  方式七:对于精确度要求更高的定时操作,则应该使用
QueryPerformanceFrequency()  

QueryPerformanceCounter()函数。这

两个函数是

VC

提供的仅供

Windows 95 及其后续版本使用的精确时间函数,

并要求计算机从硬件上支持精确定时器。如示例工程中的
Timer7、Timer7_1、Timer7_2、Timer7_3。
QueryPerformanceFrequency()函数和 QueryPerformanceCounter()函
数的原型如下:
       BOOL  QueryPerformanceFrequency(LARGE_INTEGER *
lpFrequency);       BOOL  QueryPerformanceCounter(LARGE_INTEGER 

lpCount);

  数据类型

ARGE_INTEGER 既可以是一个 8 字节长的整型数,也可以是两

4

 

字节长的整型数的联合结构, 其具体用法根据编译器是否支持

64 位而定。

该类型的定义如下:
       typedef union _LARGE_INTEGER       {           struct           { 
DWORD LowPart ;// 4

              

字节整型数

LONG  HighPart;// 4 字节整型

           

};           LONGLONG QuadPart ;// 8

                   

字节整型数

}

LARGE_INTEGER ;
  在进行定时之前,先调用

QueryPerformanceFrequency()函数获得机器

 

内部定时器的时钟频率, 然后在需要严格定时的事件发生之前和发生之后分别
调用

QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频

 

率,计算出事件经 历的精确时间。下列代码实现

1ms 的精确定时:

       LARGE_INTEGER litmp;        LONGLONG QPart1,QPart2; 
double dfMinus, dfFreq, dfTim; 
QueryPerformanceFrequency(&litmp);       dfFreq = 
(double)litmp.QuadPart;// 获得计数器的时钟频率 
QueryPerformanceCounter(&litmp);       QPart1 = litmp.QuadPart;// 

       

获得初始值

do       {          QueryPerformanceCounter(&litmp); 

QPart2 = litmp.QuadPart;//

          

获得中止值

dfMinus = (double)

(QPart2-QPart1);          dfTim = dfMinus / dfFreq;// 获得对应的时间值,

       

单位为秒

}while(dfTim<0.001);

  其定时误差不超过

1 微秒,精度与 CPU

 

等机器配置有关。 下面的程序用来

测试函数

Sleep(100)的精确持续时间: