短的定時中其計時誤差為15ms,在較長的定時中其計時誤差較低,如果定時時間太長,就好象死機一樣,CPU占用率非常高,只能用于要求不高的延時程序中.
下列代碼可以實現50ms的精確定時:
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
//為了在延遲時間不阻塞。可在此將消息傳出,但是會降低精度
MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <50);
二,這就是我現在使用的方法,也決定以后都使用。。哈哈
使用多媒體定時器timeSetEvent()函數,該函數定時精度為ms級(精度基本準確,由于掛接窗口一般是在工具中實現,內部人員使用,所以不需要控制機器配置)。
MMRESULT timeSetEvent( UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
WORD dwUser,
UINT fuEvent )
該函數設置一個定時回調事件,此事件可以是一個一次性事件或周期性事件。事件一旦被激活,便調用指定的回調函數, 成功后返回事件的標識符代碼,否則返回NULL
參數說明:
uDelay:以毫秒指定事件的周期。
Uresolution:以毫秒指定延時的精度,數值越小定時器事件分辨率越高。缺省值為1ms。
LpTimeProc:指向一個回調函數。
DwUser:存放用戶提供的回調數據。
FuEvent:指定定時器事件類型:
TIME_ONESHOT:uDelay毫秒后只產生一次事件
TIME_PERIODIC :每隔uDelay毫秒周期性地產生事件。
需要注意的是,任務處理的時間不能大于周期間隔時間。另外,在定時器使用完畢后, 應及時調用timeKillEvent()將之釋放。
雖然還有更加精確的計時方法,不過對于我的需求這個以經夠用了
我的實現代碼
UINT uTimerID; //定義定時器句柄
void CALLBACK TimerCallProc(UINT TimerID, UINT msg,DWORD dwUser, DWORD dwa,DWORD dwb)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
Sleep(1);
}
//當前設置為1ms...
uTimerID=timeSetEvent(1,1,&TimerCallProc,0,TIME_PERIODIC);
//退出時
timeKillEvent(uTimerID); //刪除定時器事件
timeEndPeriod(1); //清除定時器分辨率