VC高精度多媒體定時器的使用_第1頁
VC高精度多媒體定時器的使用_第2頁
VC高精度多媒體定時器的使用_第3頁
VC高精度多媒體定時器的使用_第4頁
VC高精度多媒體定時器的使用_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、雖然Win95下可視化開發(fā)工具如VC 、Delphi 、C Builder等都有專用的定時器控件Timer ,而且使用很方便,可以實現(xiàn)一定的定時功能,但最小計時精度僅為55ms ,且定時器消息在多任務操作系統(tǒng)中的優(yōu)先級很低,不能得到及時響應,往往不能滿足實時控制環(huán)境下的應用。不過Microsoft 公司在Win32 API函數(shù)庫中已經為用戶提供了一組用于高精度計時的底層函數(shù),如果用戶使用得當,計時精度可到1ms 。這個計時精度、對于一般的實時系統(tǒng)控制完全可以滿足要求?,F(xiàn)將由C Builder 4.0提供的重新封裝后的一組與時間相關的主要接口函數(shù)(函數(shù)名、參數(shù)、功能與Win32 API基本相同)

2、說明如下:1DWORD timeGetTime(void返回從Windows 啟動開始經過的毫秒數(shù)。最大值為232,約49.71天。2MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD dwUser,UINT fuEvent該函數(shù)設置一個定時回調事件,此事件可以是一個一次性事件或周期性事件。事件一旦被激活,便調用指定的回調函數(shù),成功后返回事件的標識符代碼,否則返回NULL 。參數(shù)說明如下:uDelay :以毫秒指定事件的周期。UResolution :以毫秒指定延時的精度,數(shù)值越小

3、定時器事件分辨率越高。缺省值為1ms 。LpTimeProc :指向一個回調函數(shù)。DwUser :存放用戶提供的回調數(shù)據(jù)。FuEvent :指定定時器事件類型:TIME_ONESHOT:uDelay 毫秒后只產生一次事件TIME_PERIODIC :每隔uDelay 毫秒周期性地產生事件。3MMRESULT timeKillEvent(UINT uTimerID該函數(shù)取消一個指定的定時器回調事件。uTimerID 標識要取消的事件(由timeSetEvent 函數(shù)返回的標識符)。如果成功則返回TIMERR_NOERROR,如果定時器時間不存在則返回MMSYSERR_INVALPARAM 。4回

4、調函數(shù)void CALLBACK TimeProc(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2;該函數(shù)是一個應用程序定義的回調函數(shù),出現(xiàn)定時器事件時該函數(shù)被調用。TimeProc是應用程序定義的函數(shù)名的占位符。使用該函數(shù)時要注意的是,它只能調用以下有限的幾組API 函數(shù):PostMessage ,timeGetSystemTime , timeGetTime, timeSetEvent,timeKillEvent,midiOutShortMsg, midiOutLongMsg,OutputDebugString 。同時也不要使用完成時

5、間很長的API 函數(shù),程序盡可能簡短。使用以上一組函數(shù)就可以完成毫秒級精度的計時和控制(在C+Builder中使用時要將頭文件mmsystem.h 加到程序中)。由于將定時控制精確到幾毫秒,定時器事件將占用大量的CPU 時間和系統(tǒng)資源,所以在滿足控制要求的前提下,應盡量將參數(shù)uResolution 的數(shù)值增大。而且定時器實時控制功能完成后要盡快釋放。注意以下幾點問題:一、回調函數(shù)的參數(shù)不能有誤,否則可能引起程序崩掉;二、事件調用周期uDelay 不能小于事件處理時間,否則會引起程序崩潰;三、通過dwUser 給回調函數(shù)傳遞參數(shù)例程如下:1MMRESULT g_wTimerID = 0;/回調函

6、數(shù),參數(shù)不能有錯2void CALLBACK CDsisiiDlg:SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw23 CDsisiiDlg* pdcpackerdlg = (CDsisiiDlg*dwUser;. 456bool CDsisiiDlg:CreateTimer( 7 8 TIMECAPS tc; 9 UINT wTimerRes; 10 11 /設置多媒體定時器 12 if(timeGetDevCaps(&tc,sizeof(TIMECAPS!=TIMERR_NOERROR/向機器申請一個多媒

7、體定時器 13 return false; 14 15 /獲得機器允許的時間間隔(一般可達到1毫秒) 16 wTimerRes=min(max(tc.wPeriodMin,1,tc.wPeriodMax; 1718 /定時器開始工作 19 timeBeginPeriod(wTimerRes; 20 21 /每過6毫秒調用回調函數(shù)timerback(,wTimerID為定時器ID.TIME_PERIODIC表周期性調用,TIME_ONESHOT表只產生一次事件 22 g_wTimerID = timeSetEvent(6, wTimerRes, (LPTIMECALLBACKSendFun, (

8、DWORDthis, TIME_PERIODIC; 23if(g_wTimerID = 0 24return false; 2526return true; 27 2829/刪除定時器30void CDsisiiDlg:DestroyTimer( 31 32 if (g_wTimerID 33 34 timeKillEvent(g_wTimerID; 35 g_wTimerID = 0; 36 37vc 高精度多媒體定時器的使用方法在VC 編程中,用SetTimer 可以定義一個定時器,到時間了,就響應OnTimer 消息,但這種定時器精度太低了。如果需要精度更高一些的定時器(精確到1ms )

9、,可以使用下面的高精度多媒體定時器進行代碼優(yōu)化,可以達到毫秒級的精度,而且使用方便。先要包含頭文件mmsystem.h 和庫文件winmm.lib 。vc 高精度多媒體定時器的使用方法如下:復制內容到剪貼板 程序代碼#include mmsystem.h /head file#pragma comment(lib,winmm /lib fileconst int timePeriod = 2;const int timeRes = 1 ;/*MMTimer fuction*CreateTimer : create a Multimedia timerDestroyTimer: destroy

10、a Multimedia timerTimerHandler: the actual timer handler procedure*/*functionname : CreateTimerdesc : create a realtime timerargumentvoidret codeHANDLE ,the handle of the timer*/UINT CMyTimer:CreateTimer(/create the timer/ Create a periodic timertimeBeginPeriod(timeRes;timerID = timeSetEvent(timePer

11、iod,timeRes,TimerHandler,(DWORDthis,TIME_PERIODIC;return timerID;/*functionname : DestroyTimerdesc : destroy the timer created by calling CreateTimerargumentvoidret codevoid*/void CMyTimer:DestroyTimer(if ( bRun timeKillEvent(timerID;timeEndPeriod(timeRes;bRun = FALSE;/*functionname : TimerHandlerde

12、sc : timer procedure called when the the timer signaledargumentdwUser,in,user para dataret codevoid*/void CALLBACK CMyTimer:TimerHandler(UINT id, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2CMyTimer* pThis = (CMyTimer*dwUser;使用多媒體定時器timeSetEvent(函數(shù),該函數(shù)定時精度為ms 級。利用該函數(shù)可以實現(xiàn)周期性的函數(shù)調用。函數(shù)的原型如下:MMRESULT timeSetEvent( UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,WORD dwUser,UINT fuEvent )該函數(shù)設置一個定時回調事件,此事件可以是一個一次性事件或周期性事件。事件一旦被激活,便調用指定的回調函數(shù), 成功后返回事件的標識符代碼,否則返回NULL 。函數(shù)的參數(shù)

溫馨提示

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

評論

0/150

提交評論