LARGE_INTEGER
LARGE_INTEGER是union;用於表示一64位有符號整數值.其他定義如下:
View Code
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
如果你有編譯器直接支援64位整數可以直接使用QuadPart(64位),否則分別對LowPart(32位)和HighPart(32位)存取,HighPart的最高位為符號位。
表示數的範圍:--3689348814741910324到+4611686018427387903
LARGE_INTEGER的值等4000000000,在記憶體中的布局:
00 28 6B EE 00 00 00 00
(低位元組 ) (高位元組 )
QueryPerformanceFrequency()
類型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬體支援的高精度計數器的頻率。
傳回值:非零,硬體支援高精度計數器;零,硬體不支援,讀取失敗。
QueryPerformanceFrequency() - 技術特點供WIN9X使用的高精度定時器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求電腦從硬體上支援高精度定時器。
函數的原形是:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
資料類型LARGEINTEGER既可以是一個作為8位元組長的整數,也可以是作為兩個4位元組長的整數的聯合結構,其具體用法根據編譯器是否支援64位而定。該類型的定義如下:
View Code
typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
在定時前應該先調用QueryPerformanceFrequency()函數獲得機器內部計時器的時鐘頻率。接著在需要嚴格計時的事件發生前和發生之後分別調用QueryPerformanceCounter(),利用兩次獲得的計數之差和時鐘頻率,就可以計算出事件經曆的精確時間。測試函數SLEEP(100)的精確期間方法:
View Code
LARGE_INTEGER litmp;
LONGLONG qt1,qt2;
double dft,dff,dfm;
QueryPerformanceFrequency(&litmp);//獲得時鐘頻率
dff=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//獲得初始值
qt1=litmp.QuadPart;Sleep(100);
QueryPerformanceCounter(&litmp);//獲得終止值
qt2=litmp.QuadPart;
dfm=(double)(qt2-qt1);
dft=dfm/dff;//獲得對應的時間值
需要注意的是DFT計算的結果單位是秒。
【參考資料 感謝作者】
http://www.cnblogs.com/whiteyun/archive/2009/09/17/1568240.html
http://www.cppblog.com/deane/articles/113151.html
補充:上面所說的內容我的理解是只能用來做計時器,不能用來做定時器。(計時器和定時器有區別吧?)
另外我查閱到資料,有GetSystemTimeAsFileTime()和clock(),這兩者都是擷取現有時間來計時的,故不是很精準,和sleep一樣的效果。請看下面
View Code
#include <stdio.h>
#include <Windows.h>
#include <time.h>
int main(int argc, char* argv[])
{
FILETIME beg,end;
GetSystemTimeAsFileTime(&beg);
Sleep(2000);
GetSystemTimeAsFileTime(&end);
clock_t cbeg,cend;
cbeg=clock();
Sleep(2000);
cend=clock();
LARGE_INTEGER start;
LARGE_INTEGER endt ;
LARGE_INTEGER frequency;
if (!QueryPerformanceFrequency(&frequency))
{
return -1;
}
QueryPerformanceCounter(&start);
Sleep(2000);
QueryPerformanceCounter(&endt);
printf("%d ns\n",100*(end.dwLowDateTime-beg.dwLowDateTime));
printf("%d ms\n",cend-cbeg);
printf("main cost:%f\n", (double)(endt.QuadPart - start.QuadPart) / (double)frequency.QuadPart);
return 0;
}
運行結果為:
LARGE_INTEGER在運行過程中的值:(請注意成員的值)