一般時控函式

2021-05-22 09:25:42 字數 2437 閱讀 6886

隨著軟硬體的飛速發展,計算機技術已經廣泛地應用到自動化控制領域,為了實現實時控制,控制程式必須能夠精確地完成定時和計時功能。vc提供了很多關於時間操作的函式,下面根據它們精度的不同,分別進行說明。    

一般時控函式    

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()自身的誤差所致。    

本文介紹了三種定時或計時的實現方法,讀者可以根據自己的實際情況進行選擇,以達到程式的定時和計時功能。以上程式均在vc   6.0、windows   98環境下除錯通過。

建構函式和一般函式

建構函式 構建創造物件時呼叫的函式,作用 可以給物件進行初始化。建立物件都必須要通過建構函式初始化。如果乙個類中沒有定義建構函式,那麼該類中就會有乙個預設的無參建構函式。如果在類中定義了指定的建構函式,那麼類中的預設建構函式就沒有了。建構函式和一般函式有什麼區別呢?建構函式 物件建立時,就會呼叫與之...

python一般函式 python 函式

秋風蕭瑟 1.在乙個函式的命名空間中給乙個變數賦全域性的值,要把該變數賦為global a none def bind a variable global a a bind a variable print a 2.一般情況下函式返回多個物件時,會返回乙個tuple。但是也可以返回乙個dict,有時...

ORACLE自增函式,一般函式

1.oracle先建立函式方法,再直接使用,mysql直接使用方法unix timestamp,from unixtime oracle to unix create date create orreplace function oracle to unix in date in date retu...