【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 编程风格又改了,先是dos风格,然后是windows风格,现在又参杂了一些old-style c风格
页:
[1]