[轉自CSDN老帖]:http://topic.csdn.net/t/20050107/12/3706743.html
1、一般用作定時相關的操作。GetTickCount() 返回開機以來經過的毫秒數
2、在要求誤差不大於1毫秒的情況下,可以採用GetTickCount()函數,該函數的傳回值是DWORD型,表示以毫秒為單位的電腦啟動後經曆的時間間隔。使用下面的編程語句,可以實現50毫秒的精確定時,其誤差小於1毫秒。
DWORD dwStart, dwStop;
// 起始值和終止值
dwStop = GetTickCount();
while(TRUE)
{
dwStart = dwStop;
// 上一次的終止值變成新的起始值
// 此處添加相應控制語句
do
{
dwStop = GetTickCount();
} while(dwStop - 50 < dwStart);
}
3、
對於一般的即時控制,使用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
{
struct
{
DWORD LowPart; // 4位元組整型數
LONG HighPart; // 4位元組整型數
};
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;
// 獲得對應的時間值