1、WM_TIMER消息映射
SetTimer()设置定时间隔,定时响应函数 OnTimer()
计时精度30ms,定时器消息在多任务操作系统中的优先级很低,不能得到及时响应。
2、sleep()函数
计时精度30ms,CPU占用率高,延时期间不能处理其他的消息。
3、COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程
计时精度秒级。
4、GetTickCount()函数
在较短的定时中其计时误差为15ms,在较长的定时中其计时误差较低,CPU占用率高。
这个函数并非实时发送,而是由系统每18ms发送一次,因此其最小精度为18ms。当需要有小于18ms的精度计算时,应使用StopWatch方法进行。
5、多媒体定时器函数DWORD timeGetTime(void)
精度为ms级
6、多媒体定时器timeSetEvent()函数
精度为ms级
7、QueryPerformanceFrequency()和QueryPerformanceCounter()函数
误差不超过1微秒,精度与CPU等机器配置有关。
(现在好像都用这种方式了)
第一个函数返回PC机8253芯片的FCLK,这个值约1.19MHz,也就是说一秒钟可发出这么多的计时信号,它的倒数约840ns,这是定时器的极限精度了。
第二个函数返回定时信号个数,求差,再乘840ns,就是时间了。
例如:
// #include "mmsystem.h"
// #pragma comment(lib, "winmm.lib")
LONGLONG t1,t2;
LONGLONG persecond;
QueryPerformanceFrequency((LARGE_INTEGER *)&persecond);//询问系统一秒钟的频率
QueryPerformanceCounter((LARGE_INTEGER *)&t1);
//下面是你要计算运行时间的程序代码
...
QueryPerformanceCounter((LARGE_INTEGER *)&t2);
double time=(t2-t1)/persecond; (单位:秒)
========================================================================
QueryPerformanceCounter()这个函数返回高精确度性能计数器的值,它可以以微妙为单位计时.但是QueryPerformanceCounter()确切的精确计时的最小单位是与系统有关的,所以,必须要查询系统以得到QueryPerformanceCounter()返回的嘀哒声的频率.QueryPerformanceFrequency()提供了这个频率值,返回每秒嘀哒声的个数.计算确切的时间是从第一次调用QueryPerformanceCounter()开始的假设得到的LARGE_INTEGER 为nStartCounter,过一段时间后再次调用该函数结束的,设得到nStopCounter.两者之差除以QueryPerformanceFrequency()的频率就是开始到结束之间的秒数.由于计时函数本身要耗费很少的时间,要减去一个很少的时间开销.但一般都把这个开销忽略.公式如下:
nStopCounter-nStartCounter
ElapsedTime=------------------------------------ - overhead
frequency
double time=(nStopCounter.QuadPart-nStartCounter.QuadPart)/frequency.Quad
=================================================================================
QueryPerformanceCounter / frequency :表示此次电脑从开机到此刻 持续的时间(秒)
小结:以上提到常用的9种时间函数,由于他们的用处不同,所以他们的精度也不尽相同,所以如果简单的延时可以用sleep函数,稍微准确的延时可以使用clock函数,GetTickCount函数,更高级的实用timeGetTime函数;简单的定时事件可以用Timer,准确地可以用timeSetEvent;或取一般系统时间可以通time,或者CTime,或者COleDateTime,获取准确的时间可以用clock,或者GetTickCount函数,或者timeGetTime函数,而获取准确地系统时间要使用硬件支持的QueryPerformanceFrequency函数,QueryPerformanceCounter函数。