Windows定時器程式設計

2021-09-07 21:05:40 字數 2233 閱讀 1131

一般時控函式    

vc程式設計師都會利用windows的wm—timer訊息對映來進行簡單的時間控制:1.呼叫函式settimer()設定定時間隔,如settimer(0,200,null)即為設定200毫秒的時間間隔;2.在應用程式中增加定時響應函式ontimer(),並在該函式中新增響應的處理語句,用來完成時間到時的操作。這種定時方法是非常簡單的,但其定時功能如同sleep()函式的延時功能一樣,精度較低,只可以用來實現諸如點陣圖的動態顯示等對定時精度要求不高的情況,而在精度要求較高的條件下,這種方法應避免採用。     

精度時控函式    

在要求誤差不大於1毫秒的情況下,可以採用gettickcount()函式,該函式的返回值是dword型,表示以毫秒為單位的計算機啟動後經歷的時間間隔。使用下面的程式設計語句,可以實現50毫秒的精確定時,其誤差小於1毫秒。    

dword   dwstart,   dwstop;    

//   起始值和終止值    

dwstop   =   gettickcount();    

while(true)    

while(dwstop   -   50   <   dwstart);    

}     

高精度時控函式    

對於一般的實時控制,使用gettickcount()函式就可以滿足精度要求,但要進一步提高計時精度,就要採用queryperformancefrequency()函式和queryperformancecounter()函式。這兩個函式是vc提供的僅供windows   9x使用的高精度時間函式,並要求計算機從硬體上支援高精度計時器。queryperformancefrequency()函式和queryperformancecounter()函式的原型為:    

bool   queryperformancefrequency(large—integer   *lpfrequency);    

bool   queryperformancecounter(large—integer   *lpcount)   ;    

資料型別large—integer既可以是乙個作為8位元組長的整型數,也可以是作為兩個4位元組長的整型數的聯合結構,其具體用法根據編譯器是否支援64位而定。該型別的定義如下:    

typedef   union   —large—integer    

;    

longlong  quadpart;    

//   8位元組整型數    

}   large—integer;    

在進行計時之前,應該先呼叫queryperformancefrequency()函式獲得機器內部計時器的時鐘頻率。筆者在主頻為266、300、333的三種pentiumⅱ機器上使用該函式,得到的時鐘頻率都是1193180hz。接著,筆者在需要嚴格計時的事件發生之前和發生之後分別呼叫queryperformancecounter()函式,利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經歷的精確時間。以下程式是用來測試函式sleep(100)的精確持續時間。    

large—integer   litmp;    

longlong   qpart1,qpart2;    

double   dfminus,   dffreq,   dftim;    

queryperformancefrequency(&litmp);    

//   獲得計數器的時鐘頻率    

dffreq   =   (double)litmp.quadpart;    

queryperformancecounter(&litmp);    

//   獲得初始值    

qpart1   =   litmp.quadpart;    

sleep(100)   ;    

queryperformancecounter(&litmp);    

//   獲得終止值    

qpart2   =   litmp.quadpart;    

dfminus   =   (double)(qpart2   -   qpart1);    

dftim   =   dfminus   /   dffreq;    

//   獲得對應的時間值    

執行上面程式,得到的結果為dftim=0.097143767076216(秒)。細心的讀者會發現,每次執行的結果都不一樣,存在一定的差別,這是由於sleep()自身的誤差所致。    

11 Windows程式設計 定時器

週期性的傳送wwl timer訊息的乙個東西,這個週期可以由程式設計師自己設定。設定週期的數是settimer,停止定時器訊息傳送的函式是 killximer 定時器訊息的特點 1.不準確 也就是說,你設定的週期是1秒,那麼有可能在980毫秒的時候,這個wm timer訊息就來了,也有可能1010毫...

linux 定時器程式設計

在編寫應用程式的時候,經常需要用到定時器。根據使用情況,定時器的基本行為分為2種 single shot timer和repeating timer single shot timer 從註冊到終止只執行一次。repeating timer每次終止後自動執行。linux 在定時程式設計有以下幾種介面...

Linux 定時器程式設計小解

基礎知識 全域性變數 jiffies 記錄時鐘中斷的次數,也就是system clk的節拍數 全域性變數 hz 記錄1秒鐘系統來幾個節拍,系統節拍頻率 很容易得到公式 系統執行的秒數 second jiffies hz static struct timer list my timer 定義乙個軟體...