VC中基於 Windows 的精確定時

2021-04-18 19:52:02 字數 2953 閱讀 2913

vc中基於 windows 的精確定時中國科學院光電技術研究所 遊志宇

coledatetime      start_time = coledatetime::getcurrenttime();

coledatetimespan end_time= coledatetime::getcurrenttime()-start_time;

while(end_time.gettotalseconds()< 2) //實現延時2秒

//這樣在延時的時候我們也能夠處理其他的訊息。

方式四:在精度要求較高的情況下,vc中可以利用gettickcount()函式,該函式的返回值是

dword型,表示以ms為單位的計算機啟動後經歷的時間間隔。精度比wm_timer訊息對映高,在較 短的定時中其計時誤差為15ms,在較長的定時中其計時誤差較低,如果定時時間太長,就好象宕機一樣,cpu佔用率非常高,只能用於要求不高的延時程式中。如示例工程中的timer4和timer4_1。下列**可以實現50ms的精確定時:

dword dwstart = gettickcount();

dword dwend = dwstart;

dowhile(dwend <50);

為使gettickcount()函式在延時或定時期間能處理其他的訊息,可以把**改為:
dword dwstart = gettickcount();

dword dwend = dwstart;

dowhile(dwend <50);

雖然這樣可以降低cpu的占有率,並在延時或定時期間也能處理其他的訊息,但降低了延時或定時精度。   方式五:與gettickcount()函式類似的多**定時器函式dword timegettime(void),該函式定時精 度為ms級,返回從windows啟動開始經過的毫秒數。微軟公司在其多**windows中提供了精確定時器的底 層api持,利用多**定時器可以很精確地讀出系統的當前時間,並且能在非常精確的時間間隔內完成一 個事件、函式或過程的呼叫。不同之處在於呼叫dword timegettime(void) 函式之前必須將 winmm.lib  和 mmsystem.h 新增到工程中,否則在編譯時提示dword timegettime(void)函式未定義。由於使用該 函式是通過查詢的方式進行定時控制的,所以,應該建立定時迴圈來進行定時事件的控制。如示例工程中的timer5和timer5_1。   方式六:使用多**定時器timesetevent()函式,該函式定時精度為ms級。利用該函式可以實現週期性的函式呼叫。如示例工程中的timer6和timer6_1。函式的原型如下:
mmresult timesetevent( uint udelay, 

uint uresolution,

lptimecallback lptimeproc,

word dwuser,

uint fuevent )

該函式設定乙個定時**事件,此事件可以是乙個一次性事件或週期性事件。事件一旦被啟用,便呼叫指定的**函式, 成功後返回事件的識別符號**,否則返回null。函式的引數說明如下:
udelay:以毫秒指定事件的週期。

uresolution:以毫秒指定延時的精度,數值越小定時器事件解析度越高。預設值為1ms。

lptimeproc:指向乙個**函式。

dwuser:存放使用者提供的**資料。

fuevent:指定定時器事件型別:

time_oneshot:udelay毫秒後只產生一次事件

time_periodic :每隔udelay毫秒周期性地產生事件。

具體應用時,可以通過呼叫timesetevent()函式,將需要週期性執行的任務定義在lptimeproc**函式 中(如:定時取樣、控制等),從而完成所需處理的事件。需要注意的是,任務處理的時間不能大於週期間隔時間。另外,在定時器使用完畢後, 應及時呼叫timekillevent()將之釋放。   方式七:對於精確度要求更高的定時操作,則應該使用queryperformancefrequency()和 queryperformancecounter()函式。這兩個函式是vc提供的僅供windows 95及其後續版本使用的精確時間函式,並要求計算機從硬體上支援精確定時器。如示例工程中的timer7、timer7_1、timer7_2、timer7_3。 queryperformancefrequency()函式和queryperformancecounter()函式的原型如下:
bool  queryperformancefrequency(large_integer *lpfrequency);

bool queryperformancecounter(large_integer *lpcount);

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

;longlong quadpart ;// 8位元組整型數

}large_integer ;

在進行定時之前,先呼叫queryperformancefrequency()函式獲得機器內部定時器的時鐘頻率, 然後在需要嚴格定時的事件發生之前和發生之後分別呼叫queryperformancecounter()函式,利用兩次獲得的計數之差及時鐘頻率,計算出事件經 曆的精確時間。下列**實現1ms的精確定時:
large_integer litmp; 

longlong qpart1,qpart2;

double dfminus, dffreq, dftim;

queryperformancefrequency(&litmp);

dffreq = (double)litmp.quadpart;// 獲得計數器的時鐘頻率

queryperformancecounter(&litmp);

qpart1 = litmp.quadpart;// 獲得初始值

dowhile(dftim<0.000001);

其定時誤差一般不超過0.5微秒,精度與cpu等機器配置有關。(完)

Windows程式設計中實現精確計時

queryperformancecounter 函式返回高精確度效能計數器的值,它可以以微妙為單位計時.queryperformancecounter 確切的精確計時的最小單位是與系統有關的,queryperformancefrequency 提供了這個系統頻率值,它返回每秒嘀噠聲的個數.int g...

windows下的C C 精確計時

由於我要測試線性篩法的速度,用上了c c 精確計時.此時傳統的clock 方法不夠用了,我們需要另一種測量的辦法,即cputicks cpufreq.如何實現呢?include large integer freq,start,stop queryperformancefrequency freq ...

VC 基於文件的列印

列印過程 onprepareprinting 函式進行列印中一些資訊的設定。onbeginprinting 函式建立列印資源。onpreparedc 函式設定具體列印一頁時的資訊。呼叫onprint 函式列印一頁。1 在利用嚮導生成單文件和多文件應用程式的過程中,使用者可以選擇應用程式是否支援列印和...