windows獲取高精度時間


如果當前系統中支持高分辨率計數器,我們可以使用 QueryPerformanceCounter 和 QueryPerformanceFrequency 進行高分辨率的計時。

QueryPerformanceFrequency()
類型:Win32API
原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
作用:返回硬件支持的高精度計數器的頻率。
返回值:非零,硬件支持高精度計數器;零,硬件不支持,讀取失敗

函數QueryPerformanceCounter用於得到高精度計時器的值(如果存在這樣的計時器)
原型:BOOL QueryPerformanceCounter(LARGE_INTEGER *ipPerformanceCount);//參數指向計數器的值
參數: LARGE_INTEGER *ipProformanceCount
為一個指針變量用於函數傳值,即指向現時計數器的值.如果安裝的硬件不支持高精度計時器,該參數將返回0,
返回值:
如果安裝的硬件支持高精度計時器,函數將返回非0值.
如果安裝的硬件不支持高精度計時器,函數將返回0

一個時間類的實現

View Code
// ------------------------------  header file -----------------------
#pragma once
#include <Windows.h>
class CTime
{
private:
    CTime(void);
    ~CTime(void);
public:
    static UINT64 GetMilliS();//毫秒
    static UINT64 GetMicroS();//微秒
    static UINT64 GetNanoS();//納秒
private:
    static UINT64 m_frequency;
    static CTime m_self;
};

// -------------------------------- CTime.cpp ------------------------------
#include "ctime.h"
#include <assert.h>

UINT64    CTime::m_frequency = 0;
CTime    CTime::m_self;

CTime::CTime(void)
{
    LARGE_INTEGER fc;

    if (!QueryPerformanceFrequency(&fc))
    {
        assert(FALSE);
    }
    m_frequency = fc.QuadPart;  //計時器的頻率
}

CTime::~CTime(void)
{
}

UINT64 CTime::GetMilliS()
{
    assert(m_frequency>1000);
    LARGE_INTEGER fc;
    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }

    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000);
    return s;
}

UINT64 CTime::GetMicroS()
{
    assert(m_frequency>1000*1000);

    LARGE_INTEGER fc;

    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }

    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000 / 1000);
    return s;
}

UINT64 CTime::GetNanoS()
{
    assert(m_frequency>1000*1000*1000);

    LARGE_INTEGER fc;

    if (!QueryPerformanceCounter(&fc))
    {
        assert(FALSE);
    }
    UINT64 c = fc.QuadPart;
    UINT64 s = (c) / (m_frequency / 1000 / 1000 / 1000);
    return s;
}

如果系統不支持高精度計時器,可以使用GetTickCount(),精度是毫秒。還可以使用clock(),其精度也是毫秒。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM