1. 程式人生 > >windows程式設計學習——多媒體時鐘

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++;
}