關於VC中的定時器

2022-08-17 22:15:14 字數 2210 閱讀 6114

寫vc程式時碰到乙個定時器的問題,說明一下。

settimer函式用於建立乙個計時器,killtimer函式用於銷毀乙個計時器。計時器屬於系統資源,使用完應及時銷毀。

settimer的函式原型如下:

uint_ptr settimer( hwnd hwnd, uint_ptr nidevent, uint uelapse,

timerproc lptimerfunc ) ;

其中hwnd是和timer關聯的視窗控制代碼,此視窗必須為呼叫settimer的執行緒所有;如果hwnd為null,沒有視窗和timer相關聯並且nidevent引數被忽略

nidevent是timer的標識,為非零值;如果hwnd為null則被忽略;如果hwnd非null而且與timer相關聯的視窗已經存在乙個為此 標識的timer,則此次settimer呼叫將用新的timer代替原來的timer。timer標識和視窗相關,兩個不同的視窗可以擁有 nidevent相同的tiemr

uelapse是以毫秒指定的計時間隔值,範圍為1毫秒到4,294,967,295毫秒(將近50天),這個值指示windows每隔多久時間給程式傳送wm_timer訊息。

lptimerfunc是乙個**函式的指標,俗稱timerfunc;如果lptimerfunc為null,系統將向應用程式佇列傳送 wm_timer訊息;如果lptimerfunc指定了乙個值,defwindowproc將在處理wm_timer訊息時呼叫這個 lptimerfunc所指向的**函式,因此即使使用timerproc代替處理wm_timer也需要向視窗分發訊息。

關於settimer的返回值:如果hwnd為null,返回值為新建立的timer的id,如果hwnd非null,返回乙個非0整數,如果settimer呼叫失敗則返回0 。

我們一般用要是是cwnd::settimer,然後在響應wm_timer訊息的ontimer函式中實現定時器的操作就可以了。但是在非mfc的程式 中,用上述的::settimer定時呼叫類自身的函式該怎麼辦呢?由於callback函式是static的,不能在其中直接呼叫類成員函式。一般給出 的方法是利用::settimer的第二個引數uint_ptr nidevent傳入this指標,第四個引數傳入callback**函式的位址;然後在callback函式中利用this呼叫自身的成員函式。

例:假設有類 class timereg , 在標頭檔案中定義如下函式

void timer_fun( hwnd hwnd, uint message, uint_ptr idtimer,

dword dwtime );

static void callback timer_proc( hwnd hwnd, uint message,

uint_ptr idtimer, dword dwtime );

在cpp檔案中新增如下**

void timereg::timer_proc( hwnd hwnd, uint message,

uint_ptr idtimer,dword dwtime)

void timereg::timer_fun(hwnd hwnd, uint message,

uint_ptr idtimer, dword dwtime )

{}注意,這樣做理論上是成立,可我試過很多次就是不呼叫timer_proc函式!!!最後,沒辦法了,換了兩個實現定時器的函式,以timesetevent和timekillenent

在標頭檔案中定義如下函式

void timer_fun( uint utimerid, uint umsg, dword_ptr dwuser,

dword_ptr dw1,dword_ptr dw2 );

static void callback timer_proc( uint utimerid, uint umsg,

dword_ptr dwuser,dword_ptr dw1, dword_ptr dw2 );

在cpp檔案中新增如下**

void timereg::timer_proc( uint utimerid, uint umsg,

dword_ptr dwuser, dword_ptr dw1,

dword_ptr dw2 )

void timereg::timer_fun( uint utimerid, uint umsg, dword_ptr dwuser,

dword_ptr dw1, dword_ptr dw2 )

{}

vc中定時器的使用

在程式設計時,會經常使用到定時器。使用定時器的方法比較簡單,通常告訴windows乙個時間間隔,然後windows以此時間間隔週期性觸發程式。通常有兩種方法來實現 傳送wm timer訊息和呼叫應用程式定義的 函式。1.1 用wm timer來設定定時器 先請看settimer這個api函式的原型 ...

VC 定時器應用

目前做的專案其中有兩個功能 選單 是 1 載入 exi檔案 已實現 2 載入 profile 檔案 要實現 其中 profile 檔案中有描述 exi檔案的資訊,試圖在載入 profile 時,也要載入 exi檔案。其中載入 exi檔案的內容已經實現了,它彈出 載入 exi檔案對話方塊 在對話方塊中...

關於定時器

定時器是個很有意思的東西,它很有用,但我認為這不是現代計算機的結構所擅長的事情。計算機適合做那些很大量的簡單重複工作,或者根據請求做出回應。dos時代是沒有程序執行緒等概念的,那時候要想做到定時真是有些麻煩 通常的做法是死迴圈不斷監測時間,發現時間到了就做特定的事情 當然你可以用delay,來指定等...