windows程式設計學習——多媒體時鐘
以下是使用多媒體計數器時涉及的函式
(1)DWORD timeGetTime(void)
返回從Windows啟動開始經過的毫秒數
(2)timeSetEvent( UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
DWORD dwUser,
UINT fuEvent ;
uDelay: 以毫秒指定事件的週期。
Uresolution: 以毫秒指定延時的精度,數值越小定時器事件解析度越高。預設值為1ms。
LpTimeProc: 指向一個回撥函式為使用者自定義函式。
DwUser: 存放使用者提供的回撥資料。
FuEvent:指定定時器事件型別:
TIME_ONESHOT: uDelay毫秒後只產生一次事件
TIME_PERIODIC :每隔uDelay毫秒週期性地產生事件。
(3) timeKillEvent(UINT uTimerID)
該函式取消一個指定的定時器回撥事件。uTimerID標識要取消的事件(由timeSetEvent函式返回的識別符號)。
如果成功則返回TIMERR_NOERROR,如果定時器時間不存在則返回MMSYSERR_INVALPARAM。
回撥函式
void CALLBACK TimeProc(
UINT uID,
UINT uMsg,
DWORD dwUser,
DWORD dw1,
DWORD dw2);
該函式是一個應用程式定義的回撥函式,出現定時器事件時該函式被呼叫。TimeProc是應用程式定義的函式名的佔位符。使用該函式
時要注意的是,它只能呼叫以下有限的幾組API函式:PostMessage,timeGetSystemTime, timeGetTime, timeSetEvent,timeKillEvent
,midiOutShortMsg, midiOutLongMsg,OutputDebugString。同時也不要使用完成時間很長的API函式,程式儘可能簡短。
注意以下幾點問題:
1、回撥函式的引數不能有誤,否則可能引起程式崩掉;
2、事件呼叫週期uDelay不能小於事件處理時間,否則會引起程式崩潰;
3、通過dwUser給回撥函式傳遞引數
下面是一個例子的程式碼:
#include <Windows.h> #include <MMSystem.h> //多媒體時鐘庫 #include <stdio.h> #pragma comment(lib, "Winmm.lib") //載入多媒體時鐘靜態庫 #define MAXMESSAGELENTH 64 //訊息最大長度為64個位元組 #define MESSAGEPERIOD 100 //訊息週期為100ms int iMessageID = 0; void CALLBACK printMessageFun(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2); int main() { char pszMessage[MAXMESSAGELENTH]; memset(pszMessage,0,64); //將陣列元素置零 sprintf(pszMessage,"testMessage"); timeSetEvent(MESSAGEPERIOD,0,printMessageFun,(DWORD)pszMessage,TIME_PERIODIC); getchar(); return 0; } void CALLBACK printMessageFun(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2) { char *p = (char *)dwUser; //強制型別轉換將DWORD型別轉換成char型別 printf("message = %s messageId=%d\n",p,iMessageID); iMessageID++; }