以下是使用多媒體計數器時涉及的函數
(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++;
}