SetTimer函數(shù)用于創(chuàng)建一個(gè)計(jì)時(shí)器,,KillTimer函數(shù)用于銷毀一個(gè)計(jì)時(shí)器,。計(jì)時(shí)器屬于系統(tǒng)資源,,使用完應(yīng)及時(shí)銷毀,。
SetTimer的函數(shù)原型如下: 關(guān)于SetTimer的返回值:如果hWnd為NULL,返回值為新建立的timer的ID,,如果hWnd非NULL,,返回一個(gè)非0整數(shù),如果SetTimer調(diào)用失敗則返回0 KillTimer的函數(shù)原型為:BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ; 參數(shù)意義同SetTimer,。
wParam為計(jì)時(shí)器的ID;如果需要設(shè)定多個(gè)計(jì)時(shí)器,,那么對每個(gè)計(jì)時(shí)器都使用不同的計(jì)時(shí)器ID,。wParam的值將隨傳遞到窗口過程中的WM_TIMER消息的不同而不同。
如果在程序的整個(gè)執(zhí)行過程中使用計(jì)時(shí)器,,一般在處理WM_CREATE消息時(shí)或WinMain中消息循環(huán)前調(diào)用SetTimer,在處理WM_DESTROY消息時(shí)或在WinMain中消息循環(huán)后return前調(diào)用KillTimer。根據(jù)SetTimer中的參數(shù)不同,,有三種方法使用計(jì)時(shí)器,。 方法一:調(diào)用SetTimer時(shí)指定窗口句柄hWnd,nIDEvent中指定計(jì)時(shí)器ID,,將lpTimerFunc置NULL從而不使用TimerProc,;在窗口過程中處理WM_TIMER消息。調(diào)用KillTimer時(shí),,使用SetTimer中指定的hWnd和id,。最好使用#define定義timer的id,例如:
方法二:調(diào)用SetTimer時(shí)指定窗口句柄hWnd,,nIDEvent中指定計(jì)時(shí)器ID,,lpTimerFunc參數(shù)不為NULL而指定為TimerProc函數(shù)的指針。這種方法使用TimerProc函數(shù)(名字可自定)處理WM_TIMER消息:
TimerProc的參數(shù)hwnd是在調(diào)用SetTimer時(shí)指定的窗口句柄,。Windows只把WM_TIMER消息送給TimerProc,,因此消息參數(shù)總是等于WM_TIMER。iTimerID值是計(jì)時(shí)器ID,,dwTimer值是與從GetTickCount函數(shù)的返回值相容的值,。這是自Windows啟動后所經(jīng)過的毫秒數(shù)。使用這種方法時(shí),,相關(guān)函數(shù)調(diào)用的形式為:
方法三:調(diào)用SetTimer時(shí)不指定窗口句柄(為NULL),,iTimerID參數(shù)自然被忽略,lpTimerFunc不為NULL而指定為TimerProc的指針,。正如上面SetTimer的討論中所說的,,此時(shí)SetTimer的返回值正是新建立的計(jì)時(shí)器的ID,需將這個(gè)ID保存以供KillTimer銷毀計(jì)時(shí)器時(shí)所用,。當(dāng)然,,KillTimer的hWnd參數(shù)也置為NULL。這種方法同樣用TimerProc處理WM_TIMER消息,。
使用這種方法的好處是不必自己指定計(jì)時(shí)器ID,這樣就不必?fù)?dān)心用錯(cuò)ID,。
使用多個(gè)計(jì)時(shí)器只要在建立計(jì)時(shí)器時(shí)指定不同的ID。比如用上面所述方法一時(shí)的情況:
如果想將一個(gè)已經(jīng)存在的計(jì)時(shí)器設(shè)定為不同的時(shí)間間隔,,可以簡單地用不同的時(shí)間值再次調(diào)用SetTimer,。
計(jì)時(shí)器并不精確,。有兩個(gè)原因: 原因一:Windows計(jì)時(shí)器是硬件和ROM BIOS架構(gòu)下之計(jì)時(shí)器一種相對簡單的擴(kuò)充,。回到Windows以前的MS-DOS程序?qū)懽鳝h(huán)境下,應(yīng)用程式能夠通過攔截者稱為timer tick的BIOS中斷來實(shí)現(xiàn)時(shí)鐘或計(jì)時(shí)器,。一些為MS-DOS編寫的程序自己攔截這個(gè)硬件中斷以實(shí)現(xiàn)時(shí)鐘和計(jì)時(shí)器,。這些中斷每54.915毫秒產(chǎn)生一次,或者大約每秒18.2次,。這是原始的IBM PC的微處理器頻率值4.772720 MHz被218所除而得出的結(jié)果,。在Windows 98中,計(jì)時(shí)器與其下的PC計(jì)時(shí)器一樣具有55毫秒的解析度,。在Microsoft Windows NT中,,計(jì)時(shí)器的解析度為10毫秒。Windows應(yīng)用程式不能以高于這些解析度的頻率(在Windows 98下,,每秒18.2次,,在Windows NT下,每秒大約100次)接收WM_TIMER消息,。在SetTimer中指定的時(shí)間間隔總是截尾后tick數(shù)的整數(shù)倍,。例如,1000毫秒的間隔除以54.925毫秒,,得到18.207個(gè)tick,,截尾后是18個(gè)tick,它實(shí)際上是989毫秒,。對每個(gè)小于55毫秒的間隔,每個(gè)tick都會產(chǎn)生一個(gè)WM_TIMER消息,。 即使忽略這幾個(gè)毫秒的差別,,計(jì)時(shí)器仍然不精確。請看原因二: 由以上兩點(diǎn),,你不能通過在處理WM_TIMER時(shí)一秒一秒計(jì)數(shù)的方法來計(jì)時(shí),。如果要實(shí)現(xiàn)一個(gè)時(shí)鐘程序,可以使用系統(tǒng)的時(shí)間函數(shù)如GetLocalTime ,,而在時(shí)鐘程序中,,計(jì)時(shí)器的作用是定時(shí)調(diào)用GetLocalTime獲得新的時(shí)間并刷新時(shí)鐘畫面,當(dāng)然這個(gè)刷新的間隔要等于或小于1秒,。 |
|