windows時間函式

2022-05-22 03:36:17 字數 4325 閱讀 3070

介紹

我們在衡量乙個函式執行時間,或者判斷乙個演算法的時間效率,或者在程式中我們需要乙個定時器,定時執行乙個特定的操作,比如在多**中,比如在遊戲中等,

都會用到時間函式。還比如我們通過記錄函式或者演算法開始和截至的時間,然後利用兩者之差得出函式或者演算法的執行時間。編譯器和作業系統為我們提供了很多時

間函式,這些時間函式的精度也是各不相同的,所以,如果我們想得到準確的結果,必須使用合適的時間函式。現在我就介紹windows下的幾種常用時間函

數。1:sleep函式

使用:sleep(1000),在windows和linux下1000代表的含義並不相同,windows下的表示1000毫秒,也就是1秒鐘;linux下表示1000秒,linux下使用毫秒級別的函式可以使用usleep。

原理:sleep函式是使呼叫sleep函式的執行緒休眠,執行緒主動放棄時間片。當經過指定的時間間隔後,再啟動執行緒,繼續執行**。sleep函式並不能起到定時的作用,主要作用是延時。在一些多執行緒中可能會看到sleep(0);其主要目的是讓出時間片。

精度:sleep函式的精度非常低,當系統越忙它精度也就越低,有時候我們休眠1秒,可能3秒後才能繼續執行。它的精度取決於執行緒自身優先順序、其他執行緒的優先順序,以及執行緒的數量等因素。

2:mfc下的timer事件

使用:1.呼叫函式settimer()設定定時間隔,如settimer(0,100,null)即為設定100毫秒的時間間隔;2.在應用程式中增加定時響應函式ontimer(),並在該函式中新增響應的處理語句,用來完成時間到時的操作。

原理:同sleep函式一樣。不同的是timer是乙個定時器,可以指定**函式,預設為ontimer()函式。

精度:timer事件的精度範圍在公釐級別,系統越忙其精度也就越差。

3:c語言下的time

使用:time_t

t;time(&t);time函式是獲取當前時間。

原理:time函式主要用於獲取當前時間,比如我們做乙個電子時鐘程式,就可以使用此函式,獲取系統當前的時間。

精度:秒級別

4:com物件中的coledatetime,coledatetimespan類

使用:coledatetime start_time =

coledatetime::getcurrenttime();

coledatetimespan end_time =

coledatetime::getcurrenttime()-start_time;

while(end_time.gettotalseconds() < 2)

原理:以上代表延時2秒,而這兩秒內我們可以迴圈呼叫dosomething(),從而實現在延時的時候我們也能夠處理其他的函式,或者訊息。

coledatetime,coledatetimespan是mfc中ctime,ctimespan在com中的應用,所以,上面的方法對於

ctime,ctimespa同樣有效。

精度:秒級別

5:c語言下的時鐘週期clock()

使用:   clock_t start =

clock();

sleep(100);

clock_t end = clock();

double d = (double)(start - end) / clocks_per_sec;

原理:clock()是獲取計算機啟動後的時間間隔。

精度:ms級別,對於短時間內的定時或者延時可以達到ms級別,對於時間比較長的定時或者延遲精度還是不夠。在windows下clocks_per_sec為1000。

6:windows下的gettickcount()

使用:  dword start = gettickcount();

sleep(100);

dword end = gettickcount();

原理:gettickcount()是獲取系統啟動後的時間間隔。通過進入函式開始定時,到退出函式結束定時,從而可以判斷出函式的執行時間,這種時間也並

非是函式或者演算法的真實執行時間,因為在函式和演算法執行緒不可能一直占用cpu,對於所有判斷執行時間的函式都是一樣,不過基本上已經很準確,可以通過查詢進行定時。gettickcount()和clock()函式是向主機板bios要real

time clock時間,會有中斷產生,以及延遲問題。

精度:windowsnt

3.5以及以後版本精度是10ms,它的時間精度比clock函式的要高,gettickcount()常用於多**中。

7:windows下timegettime

使用:需要包含mmsystem.h,windows.h,加入靜態庫winmm.lib.

timebeginperiod(1);

dword start = timegettime();

sleep(100);

dword end = timegettime();

timeendperiod(1);

原理:timegettime也時常用於多**定時器中,可以通過查詢進行定時。通過查詢進行定時,本身也會影響定時器的定時精度。

精度:毫秒,與gettickcount()相當。但是和gettickcount相比,timegettime可以通過timebeginperiod,timeendperiod設定定時器的最小解析精度,

timebeginperiod,timeendperiod必須成對出現。

8:windows下的timesetevent

使用:還記的vc下的timer嗎?timer是乙個定時器,而以上我們提到幾種時間函式或者型別,實現定時功能只能通過輪訓來實現,也就是必須另外建立乙個執行緒單獨處理,這樣會影響定時精度,好在windows提供了內建的定時器timesetevent,函式原型為

mmresult timesetevent( uint udelay,

//以毫秒指定事件的週期

uint uresolution,

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

lptimecallback lptimeproc, //指向乙個**函式

word dwuser, //存放使用者提供的**資料

uint fuevent )//

標誌引數,time_oneshot:執行一次;time_periodic:週期性執行

具體應用時,可以通過呼叫timesetevent()函式,將需要週期性執行的任務定義在

lpfunction**函式中(如:定時取樣、控制等),從而完成所需處理的事件。需要注意的是:任務處理的時間不能大於週期間隔時間。另外,在定

時器使用完畢後,應及時呼叫timekillevent()將之釋放。

原理:可以理解為代**函式的timegettime

精度:毫秒,timesetevent可以通過timebeginperiod,timeendperiod設定定時器的最小解析精度,

timebeginperiod,timeendperiod必須成對出現。

9:高精度時控函式queryperformancefrequency,queryperformancecounter

使用:large_integer m_nfreq;

large_integer m_nbegintime;

large_integer nendtime;

queryperformancefrequency(&m_nfreq); //

獲取時鐘週期

queryperformancecounter(&m_nbegintime); //

獲取時鐘計數

sleep(100);

queryperformancecounter(&nendtime);

cout <<

(nendtime.quadpart-m_nbegintime.quadpart)*1000/m_nfreq.quadpart

<< endl;

原理:cpu上也有乙個計數器,以機器的clock為單位,可以通過rdtsc讀取,而不用中斷,因此其精度與系統時間相當。

精度:計算機獲取硬體支援,精度比較高,可以通過它判斷其他時間函式的精度範圍。

10小結:以上提到常用的9種時間函式,由於他們的用處不同,所以他們的精度也不盡相同,所以如果簡單的延時可以用sleep函式,稍微準確的延時可以使

用clock函式,gettickcount函式,更高階的實用timegettime函式;簡單的定時事件可以用timer,準確地可以用

timesetevent;或取一般系統時間可以通time,或者ctime,或者coledatetime,獲取準確的時間可以用clock,或者

gettickcount函式,或者timegettime函式,而獲取準確地系統時間要使用硬體支援的

queryperformancefrequency函式,queryperformancecounter函式。

Windows時間函式大全

介紹 我們在衡量乙個函式執行時間,或者判斷乙個演算法的時間效率,或者在程式中我們需要乙個定時器,定時執行乙個特定的操作,比如在多 中,比如在遊戲中等,都會用到時間函式。還比如我們 通過記錄函式或者演算法開始和截至的時間,然後利用兩者之差得出函式或者演算法的執行時間。編譯器和作業系統為我們提供了很多時...

Windows的日期 時間函式的例子

windows api的日期 時間這方面的國際化,需要先獲得相關locale的日期 時間的格式 以及把資料轉換為locale或直接指定的格式的字串供輸出。下面是個基本例子 include stdafx.h include windows.h include stdio.h include bool ...

Windows 時間同步

讓系統時間更準確 引用 http ruanqizhen.spaces.live.com blog cns 5852d4f797c53fb6 1213.entry 使用ntp協議可以讓你的計算機自動與伺服器上的時間同步。從而保持最準確的時間。在 windows xp 2000 可下使用以下命令設定計算...