在Windows中使用精確計時器_第1頁
在Windows中使用精確計時器_第2頁
在Windows中使用精確計時器_第3頁
在Windows中使用精確計時器_第4頁
在Windows中使用精確計時器_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、在Windows中使用精確計時器 1.前言。 我們知道,在Windows中,可以通過調(diào)用SetTimer函數(shù)為應(yīng)用程序分配一個計時器。當指定了一個時間間隔以后,Windows系統(tǒng)將每隔指定的時間向應(yīng)用發(fā)送一條WM_TIMER消息,從而使應(yīng)用程序能夠?qū)崿F(xiàn)許多與時間相關(guān)的動作。 然而需要指出的是,由系統(tǒng)發(fā)給應(yīng)用程序的WM_TIMER消息并不是異步的,這條消息被放在常規(guī)的消息隊列中,并與其它消息一起排序。因此,即使我們在調(diào)用SetTimer()時設(shè)定了1000毫秒的時間間隔,應(yīng)用程序卻不一定保證每隔一秒鐘接受到一條WM_TIMER消息,如果另一個程序的忙碌時間超過一秒鐘,那么我們的應(yīng)用程序在那段時間

2、內(nèi)就不能接收到任何WM_TIMER消息。 顯然,這種情況的存在對那些需要精確時間間隔的應(yīng)用(如某些監(jiān)控程序)來說是致命的。所幸的是,在Windows中隱藏著某些機制,使得我們能夠獲得精確計時器服務(wù)。2.系統(tǒng)計時器. 在Windows的SYSTEM.DRV驅(qū)動程序中提供了幾個鮮為人知的系統(tǒng)計時器函數(shù)(這幾個函數(shù)未寫入Windows.h中,但卻被SYSTEM.DRV輸出了),這幾個函數(shù)可以幫助我們獲得精確計時器服務(wù),即系統(tǒng)計時器。這其中最重要的是CreateSystemTimer()和KillSystemTimer(),這兩個函數(shù)允許我們安裝異步計時器的回調(diào)函數(shù)(Callback),有些類似于在D

3、OS環(huán)境中截取INT 8中斷處理程序。這個回調(diào)是真正異步的,完全避開了Windows的消息工具,因而具有重要意義。事實上,Microsoft Excel和Windows COMM驅(qū)動程序都用到了系統(tǒng)計時器,而由SetTimer()安裝的一般計時器也是由系統(tǒng)計時器來實現(xiàn)的。這兩個函數(shù)的原型如下:WORD CreateSystemTimer(wMsecInterval,lpfnTimerProc);WORD wMsecInterval; /*以毫秒為單位的時間間隔,系統(tǒng)將每隔此時間調(diào)用一 次回調(diào)函數(shù)*/FARPROC lpfn TimerProc;/*指向回調(diào)函數(shù)的指針*/WORD KillSys

4、temTimer(hTimer);WORD hTimer;/*欲釋放的系統(tǒng)計時器句柄*/其中,CreateSystemTimer()用于安裝一個系統(tǒng)計時器回調(diào)函數(shù),SYSTEM INT8處理程序?qū)磜MsecInterval指定的時時間間隔調(diào)用此回調(diào)函數(shù)。當然,這個指定的回調(diào)頻率也是有限的,同SetTimer()一樣,每秒鐘調(diào)用回調(diào)函數(shù)次數(shù)不能超過18.2次,即wMsecInterval>55。該函數(shù)返回一個系統(tǒng)計時器句柄。若安裝失敗,則返回NULL。KillSystemTimer()則用于撤銷一個已安裝的系統(tǒng)計時器hTimer。若成功,則返回;出錯則返回傳給它的參數(shù)hTimer。3.使

5、用系統(tǒng)計時器應(yīng)注意的問題。系統(tǒng)計時器回調(diào)函數(shù)雖然不是中斷處理程序,但由于它直接被中斷處理程序調(diào)用,因此也必將它看作中斷代碼。這也就決定了在使用過程中必須注意以下幾個問題:(1).在回函數(shù)中應(yīng)包括盡量少的代碼,以使得頻繁回調(diào)的該函數(shù)不至于占用太多的CPU時間。一般情況下,系統(tǒng)計時器總是用來監(jiān)視或設(shè)置某些變量的值。(2).由于該回調(diào)函數(shù)屬于中斷代碼,因此大多數(shù)Windows API函數(shù)調(diào)用都不適用了,只有幾個簡單的函數(shù)仍然可以使用,如PostMessage(),GetCurrentTask()和MessageBeep()等。(3).由于該回調(diào)函數(shù)由中斷處理程序直接調(diào)用,因此該函數(shù)必須放在一個固定的

6、代碼段中,并且調(diào)用前必須裝載DS寄存器,這可由形實替換函數(shù)MakeProcInstance()來做到。另外,由于這兩個函數(shù)在Windows.h中沒有給出(即Windows缺省輸入庫不含此兩函數(shù)),因此在調(diào)用之前必須進行鏈接。這可采用運行時動態(tài)鏈接,即通過GetModuleHandle()和GetProcAddress()來鏈接;也可在程序模塊定義文件中用IMPORTS語句來引入,此時則必須在程序源文件中說明CreateSystemTimer()和KillSystemTimer()為外部函數(shù)。本文給出的例子采用第二種方案。4.一個例子。本文最后給出一個簡單的例子,以說明系統(tǒng)計時器是如何工作的。在

7、本例中,我們安裝了一個每秒鐘調(diào)用一次的回調(diào)函數(shù),該回調(diào)函數(shù)發(fā)出一聲蜂鳴。為了測試該系統(tǒng)計時器,我們特意編寫了一段較長時間的循環(huán)語句。在這段循環(huán)中,由SetTimer()安裝的通常計時器是不能工作的(因為Windows是一個非搶先的系統(tǒng)),而我們安裝的系統(tǒng)計時器仍然能每隔一秒鐘發(fā)出一聲蜂鳴。該例子在MSVC+1.5中調(diào)試通過,運行良好。/SystemT.c#include<windows.h>extern WORD WINAPI CreateSystemTimer(WORD wTimeOut,FARPROC lpfnTimerProc);extern WORD WINAPI Kill

8、SystemTimer(WORD hTimer);void FAR PASCAL_export MyTimerProc(void);WORD SetUpSystemTimer(WORD wTimeOut);BOOL ClearSystem Timer(WORD hTm);FARPROC fpTimerProc=NULL;WORD hTimer=NULL;char szAppName="SystemTimer"int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpszCmdParam,int nCmd

9、Show)WNDCLASS wc;HWND hWndMain;int i,j;HCURSOR hcurSave;if(hPrevInstance=NULL)wc.lpszMenuName =NULL; wc.lpszClassName =szAppName;wc.hInstance =hInstance; wc.hIcon =LoadIcon(NULL,IDI_APPLICATION);wc.hCursor =LoadCursor(NULL,IDC_ARROW);wc.hbrBackground =(HBRUSH)COLOR_WINDOW+1;wc.style =0; wc.lpfnWndpr

10、oc =DefWindowProc;wc.cbClsExtra =0; wc.cbWndExtra =0;if(!RegisterClass(&wc)return(0);if(hWndMain=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL)=NULL)return(0);ShowWindow(hWndmain,nCmdShow);Update Window(hWndM

11、ain);fpTimerProc=MakeProcInstance(FARPROC)MyTimerProc,hInstance);if(hTimer=SetUpSystemTimer(1000)=NULLMessageBox(hwndMain,"Set System Timer Error",szAppName,MB_ICONEXCLAMATION:MB_OK);return 0;hcurSave=SetCursor(LoadCursor(NULL,IDC_WAIT);for(i=0;i<10000;i+)for(j=0;j<10000;j+)SetCursor

12、(hcurSave);ClearSystemTime(hTimer);WORD SetUpSystemTime(WORD wTimeOut)WORD hTm;if(hTm=CreateSystemTimer(wTimeOut,fpTimerProc)=NULL)fpTimerProc=NULL:return NULLelse return hTm;BOOL ClearSystemTimer(WORD hTm)if(hTm)if(KillSystemTimer(hTm)!=0)return FALSE;hTm=NULL;return TRUEvoidFAR PASCAL_export MyTimerProc(void)MessageBeep(0);/SystemT.defNAME SystemTimerDESCRIPTIONSystem TimerEXETYPE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論