该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事
件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,
否则返回
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)的精确持续时间: