0xAA55 发表于 2014-4-11 02:18:19

【C++】C++写的Windows下微秒级精确的定时器

因为是针对Windows的所以没有什么可移植性。因为用到了API。
当然只需要把用到API的部分修改掉,你就可以把它移植到别的系统,只是这样我就不能保证精确度了。
因为是全内联,所以不需要CPP文件。/*****************************************************************************
* WinTimer:Windows下专用的计时器。
* 使用QueryPerformanceFrequency和QueryPerformanceCounter进行微秒级精确定时
* 注意QueryPerformanceCounter和RDTSC指令不同,RDTSC在多核处理器上会产生误差
* 而QueryPerformanceCounter不会。
* 此类不可移植到非Windows平台。
*
* 单位:秒
*
****************************************************************************/

#ifndef _WINTIMER_
#define _WINTIMER_

#include<windows.h>
#ifndef WINTIMER_INLINE
#define WINTIMER_INLINE __forceinline
#endif
#ifndef WINTIMER_REAL
#define WINTIMER_REAL   double
#endif

#define LI2REAL(li)   (WINTIMER_REAL)(li.QuadPart)

class WinTimer
{
private:
    WINTIMER_REAL   m_rFreq;
    WINTIMER_REAL   m_rStartTime;
    WINTIMER_REAL   m_rPauseTime;
    WINTIMER_REAL   m_rLastTime;
    WINTIMER_REAL   m_rElaspedTime;
    bool            m_bPaused;

    WINTIMER_INLINE
    doubleGetSysTime()
    {
      LARGE_INTEGER li;
      QueryPerformanceCounter(&li);
      return LI2REAL(li)/m_rFreq;
    }
public:
    WINTIMER_INLINE
    WinTimer()
    {
      LARGE_INTEGER li;
      QueryPerformanceFrequency(&li);
      m_rFreq=LI2REAL(li);
      ResetTimer();
    }

    WINTIMER_INLINE
    WinTimer(WINTIMER_REAL Time)
    {
      LARGE_INTEGER li;
      QueryPerformanceFrequency(&li);
      m_rFreq=LI2REAL(li);
      ResetTimer();
      m_rStartTime-=Time;
    }

    WINTIMER_INLINE
    void StartTimer()
    {
      if(m_bPaused)
      {
            m_rStartTime+=GetSysTime()-m_rPauseTime;
            m_bPaused=false;
      }
    }

    WINTIMER_INLINE
    void PauseTimer()
    {
      if(!m_bPaused)
      {
            m_rPauseTime=GetSysTime();
            m_bPaused=true;
      }
    }

    WINTIMER_INLINE
    void ResetTimer()
    {
      m_rStartTime=m_rPauseTime=GetSysTime();
      m_bPaused=true;
      m_rLastTime=0;
      m_rElaspedTime=0;
    }

    WINTIMER_INLINE
    double GetTime()
    {
      if(m_bPaused)
            return m_rPauseTime-m_rStartTime;
      else
            return GetSysTime()-m_rStartTime;
    }

    WINTIMER_INLINE
    void SetTime(WINTIMER_REAL Time)
    {
      m_rStartTime=m_rPauseTime=GetSysTime()-Time;
    }

    WINTIMER_INLINE
    operator WINTIMER_REAL()//直接转换成WINTIMER_REAL
    {
      return GetTime();
    }

    WINTIMER_INLINE
    void UpdateElaspedTime()
    {
      WINTIMER_REAL rNow=GetTime();
      m_rElaspedTime=rNow-m_rLastTime;
      m_rLastTime=rNow;
    }

    WINTIMER_INLINE
    WINTIMER_REAL ElaspedTime()
    {
      return m_rElaspedTime;
    }
};

#endif

元始天尊 发表于 2014-4-11 11:48:46

编程风格又改了,先是dos风格,然后是windows风格,现在又参杂了一些old-style c风格
页: [1]
查看完整版本: 【C++】C++写的Windows下微秒级精确的定时器