微秒级计时器类

本文介绍了一个基于Windows平台的微秒级定时器类CTimer,该类利用QueryPerformanceCounter和QueryPerformanceFrequency函数实现高精度的时间测量和延迟。通过将所需延迟时间转换为CPU周期数,并不断检查当前CPU周期数来达到指定的延迟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//Timer.h

#include <windows.h>

class CTimer
{
public:
    CTimer(void);
    ~CTimer(void);


    void Delay(DWORD dwMicrosecond);

 

    void TimeBegin(void);
    void TimeEnd(void);   

    DWORD GetTimeValue(void) const;

 

    void Reset(void);

 

private:
    LARGE_INTEGER m_i64CPUFreq; 

    LARGE_INTEGER m_i64Begin;
    LARGE_INTEGER m_i64End;

};

 

 

//Timer.cpp

#include <algorithm>
using namespace std;

#include "Timer.h"

 

CTimer::CTimer(void)
{
 QueryPerformanceFrequency(&m_i64CPUFreq);
}

 

CTimer::~CTimer(void)
{
}

/////////////////////////////////////////////////////////////////////////////
// 延时N微秒

void CTimer::Delay(DWORD dwMicrosecond)
{   
    const DWORD dwSToUs = 1000000L; 

    const DWORD dwMsToUs = 1000;  

 

    DWORD dwS, dwMs, dwUs, dwResidue;
    LARGE_INTEGER i64TickCount;

 

    dwS = dwMicrosecond / dwSToUs;
    dwResidue = dwMicrosecond % dwSToUs;

    dwMs = dwResidue / dwMsToUs;
    dwUs = dwResidue % dwMsToUs;

 

    i64TickCount.QuadPart = dwS * m_i64CPUFreq.QuadPart
                          + dwMs * m_i64CPUFreq.QuadPart / dwMsToUs
                          + dwUs * m_i64CPUFreq.QuadPart / dwSToUs;

 

    LARGE_INTEGER i64Begin, i64End, i64CurrentTick;


     QueryPerformanceCounter(&i64Begin);
    
    i64End.QuadPart = i64Begin.QuadPart + i64TickCount.QuadPart;

 

    do
    {
     QueryPerformanceCounter(&i64CurrentTick);
    } while (i64CurrentTick.QuadPart <= i64End.QuadPart);
   
    return;
}

/////////////////////////////////////////////////////////////////////////////
// 计时开始

void CTimer::TimeBegin(void)
{
    QueryPerformanceCounter(&m_i64Begin);
}

/////////////////////////////////////////////////////////////////////////////
// 计时结束

void CTimer::TimeEnd(void)
{
    QueryPerformanceCounter(&m_i64End);
}

/////////////////////////////////////////////////////////////////////////////

//得到时间值,返回微秒数

DWORD CTimer::GetTimeValue(void) const
{
    DWORD dwTotalMicrosecond = 0;
    LARGE_INTEGER i64TickCount;
    i64TickCount.QuadPart = m_i64End.QuadPart - m_i64Begin.QuadPart;
    dwTotalMicrosecond = i64TickCount.QuadPart * 1000000 / m_i64CPUFreq.QuadPart;

    return dwTotalMicrosecond;
}

/////////////////////////////////////////////////////////////////////////////
// 复位计时器

void CTimer::Reset(void)
{
    m_i64Begin = m_i64End;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值