方式二:
VC 中使用 sleep()函数实现延时,它的单位是 ms,如延时 2 秒,用
sleep(2000)
。精度非常 低,最小计时精度仅为
30ms,用 sleep 函数的不利处在于延时期间
不能处理其他的消息,如果时间太 长,就好象死机一样,
CPU 占用率非常高,只能用于要求
不高的延时程序中。如示例工程中的
Timer2。
方式三:利用
COleDateTime 类和 COleDateTimeSpan 类结合 WINDOWS 的消息处理
过程来实现秒级延时。如示例工程中的
Timer3 和 Timer3_1。以下是实现 2
秒的延时代码:
COleDateTime start_time = COleDateTime::GetCurrentTime(); COleDateTimeSpan
end_time= COleDateTime::GetCurrentTime()-start_time; while(end_time.GetTotalSeconds()< 2) //
实现延时
2 秒 { MSG msg; GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg); DispatchMessage(&msg); //以上四行是实现在延
时或定时期间能处理其他的消息,
//虽然这样可以降低 CPU 的占有率, //
但降低了延时或定时精度,实际应用中可以去掉。
end_time =
COleDateTime::GetCurrentTime()-start_time; }//这样在延时的时候我们也能够处理其他的消息。
方式四:在精度要求较高的情况下,
VC
中可以利用
GetTickCount()函数,
该函数的返回值是
DWORD 型,表示以 ms 为单位的计算机启动后经历的时
间间隔。精度比
WM_TIMER
消息映射高,在较 短的定时中其计时误差为
15ms,在较长的定时中其计时误差较低,如果定时时间太长,就好象死机一
样,
CPU 占用率非常高,只能用于要求不高的延时程序中。如示例工程中的
Timer4 和 Timer4_1。下列代码可以实现 50ms 的精确定时:
DWORD dwStart = GetTickCount(); DWORD dwEnd = dwStart; do
{ dwEnd = GetTickCount()-dwStart; }while(dwEnd <50);
为使
GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码
改为:
DWORD dwStart = GetTickCount(); DWORD dwEnd = dwStart; do {
MSG msg; GetMessage(&msg,NULL,0,0); TranslateMessage(&msg);
DispatchMessage(&msg); dwEnd = GetTickCount()-dwStart; }while(dwEnd <50);
虽然这样可以降低
CPU 的占有率,并在延时或定时期间也能处理其他的消息,
但降低了延时或定时精度。
方式五:与
GetTickCount()函数类似的
多媒体定时器
函数
DWORD
timeGetTime(void)
,该函数定时精 度为
ms 级,返回从 Windows 启动开始
经过的毫秒数。微软公司在其多媒体
Windows
中提供了精确定时器的底 层
API
持,利用
多媒体定时器
可以很精确地读出系统的当前时间,并且能在非常精确的
时间间隔内完成一 个事件、函数或过程的调用。不同之处在于调用
DWORD
timeGetTime(void)
函数之前必须将
Winmm.lib
和
Mmsystem.h 添加到
工程中,否则在编译时提示
DWORD timeGetTime(void)函数未定义。由于使
用该 函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行
定时事件的控制。如示例工程中的
Timer5 和 Timer5_1。
方式六:使用
多媒体定时器
timeSetEvent()函数,该函数定时精度为 ms
级。利用该函数可以实现周期性的函数调用。如示例工程中的
Timer6 和
Timer6_1
。函数的原型如下:
MMRESULT timeSetEvent
(
UINT uDelay,
UINT uResolution, LPTIMECALLBACK lpTimeProc,
WORD dwUser, UINT fuEvent )