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