1. 程式人生 > >獲取系統時間(精確到微秒),驅動中KeQueryPerformanceCounter,Win32程式QueryPerformanceCounter

獲取系統時間(精確到微秒),驅動中KeQueryPerformanceCounter,Win32程式QueryPerformanceCounter

今天在做驅動開發時,需要操作時間,而且還要精確到us,而GetTickCount()函式只能精確到ms,所以就用到下面的函式:

LARGE_INTEGER  KeQueryPerformanceCounter( IN PLARGE_INTEGER PerformanceFrequency OPTIONAL ); 

其中PerformanceFrequency 表示CPU的頻率,此函式返回系統從啟動到此刻的時間,型別為LARGE_INTEGER。

使用舉例:

    ULONG QuerySystemTime() 
   { 
           LARGE_INTEGER CurTime, Freq; 
           CurTime = KeQueryPerformanceCounter

(&Freq); 
           return (ULONG)((CurTime.QuadPart * 1000)/Freq.QuadPart); 
    } 
    這個函式的精度為1ms,如果想要得到微秒,則把 1000 改為 1000000。

2.在應用程式中精確獲取系統時間,則使用下面函式:

    QueryPerformanceCounter(IN OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);

    但這是獲取CPU頻率就需要下面這個函數了:

    QueryPerformanceFrequency(IN OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);

    例子:

*****************************************************test.cpp******************************************************************

#include <stdio.h>
#include <Windows.h>

LONGLONG GetLastTime()
{
    // CPU頻率
    LARGE_INTEGER liQPF;
    
    // 記錄開始和結束時間
    LARGE_INTEGER liStartTime, liEndTime;
    
    // 記錄過程時間
    LONGLONG llLastTime;
    
    // 獲取CPU頻率
    QueryPerformanceFrequency(&liQPF);
    
    // 獲取開始時間
    QueryPerformanceCounter(&liStartTime);
    
    Sleep(10);
    
    // 獲取結束時間
    QueryPerformanceCounter(&liEndTime);
    
    // 計算持續時間(us)
    llLastTime = 1000000 * (liEndTime.QuadPart - liStartTime.QuadPart) / liQPF.QuadPart;
    
    return llLastTime;
}

int main(void)
{
    DWORD start,stop;
    start   = GetTickCount();
    Sleep(10);
    stop = GetTickCount();
    printf("%d ms\n",stop-start); //GetTickCount()計算得到的時間間隔精度為15ms,例如計算10ms間隔結果為0


    printf("%d us\n",GetLastTime());//應用程式中時間間隔計算精確到us,QueryPerformanceCounter()
    return 0;
}