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

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章