天天看點

标準C語言定時器timeSetEvent()

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);

 }

}

繼續閱讀