timeSetEvent()函數
MMRESULT timeSetEvent( UINT uDelay,
UINT uResolution,
LPTIMECALLBACK lpTimeProc,
WORD dwUser,
UINT fuEvent )
uDelay:以毫秒指定事件的周期。
Uresolution:以毫秒指定延時的精度,數值越小定時器事件分辨率越高。預設值為1ms。
LpTimeProc:指向一個回調函數。
DwUser:存放使用者提供的回調資料。
FuEvent:指定定時器事件類型:
TIME_ONESHOT:uDelay毫秒後隻産生一次事件
TIME_PERIODIC :每隔uDelay毫秒周期性地産生事件。
/
微軟公司在其多媒體Windows中提供了精确定時器的底層API支援。利用多媒體定時器可以很精确地讀出系統的目前時間,并且能在非常精确的時間 間隔内完成一個事件、函數或過程的調用。利用多媒體定時器的基本功能,可以通過兩種方法實作精确定時。1)使用timeGetTime()函數,該函數定 時精度為ms級,傳回從Windows啟動開始所經過的時間。由于使用該函數是通過查詢的方式進行定時控制的,是以,應該建立定時循環來進行定時事件的控 制。2)使用timeSetEvent()函數,該函數原型如下:
MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,
DWORD dwUser,UINT fuEvent);
該函數的參數說明如下:參數uDelay表示延遲時間;參數uResolution表示時間精度,在Windows中預設值為 1ms;lpTimeProc表示回調函數,為使用者自定義函數,定時調用; 參數dwUser表示使用者提供的回調資料;參數fuEvent為定時器的事件類型,TIME_ONESHOT表示執行一次;TIME_PERIODIC: 周期性執行。具體應用時,可以通過調用timeSetEvent()函數,将需要周期性執行的任務定義在lpTimeProc回調函數中(如:定時采樣、 控制等),進而完成所需處理的事件。需要注意的是:任務處理的時間不能大于周期間隔時間。另外,在定時器使用完畢後,應及時調用 timeKillEvent()将之釋放。
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#pragma comment(lib,"Winmm.lib")
#define ONE_MILLI_SECOND 1 //定義1ms和2s時鐘間隔,以ms為機關 ;
#define TWO_SECOND 2000
#define TIMER_ACCURACY 1 //定義時鐘分辨率,以ms為機關
void PASCAL OneMilliSecondProc(UINT wTimerID, UINT msg,DWORD dwUser,DWORD dwl,DWORD dw2)
{
printf("end!!!!!!!!!!!/n");
exit(0);
}
void main()
{
HANDLE hHandle;
UINT wTimerRes_1ms,wTimerRes_2s=2;//定義時間間隔
UINT wAccuracy=1; //定義分辨率
UINT TimerID_1ms,TimerID_2s; //定義定時器句柄
wTimerRes_1ms = 5000; //系統運作的總時間1000為1秒
if( (TimerID_1ms = timeSetEvent(wTimerRes_1ms, wAccuracy,(LPTIMECALLBACK)OneMilliSecondProc, // 回調函數
(DWORD)(1), // 使用者傳送到回調函數的資料;
TIME_PERIODIC)) != 0)//周期調用定時處理函數
{
printf("start!!!!!!!!!!!/n");
}
while (1)
{
printf("hello!/n");
Sleep(1000);
}
}