找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3835|回复: 1

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

[复制链接]
发表于 2014-4-11 02:18:19 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

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

  11. #ifndef _WINTIMER_
  12. #define _WINTIMER_

  13. #include<windows.h>
  14. #ifndef WINTIMER_INLINE
  15. #define WINTIMER_INLINE __forceinline
  16. #endif
  17. #ifndef WINTIMER_REAL
  18. #define WINTIMER_REAL   double
  19. #endif

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

  21. class WinTimer
  22. {
  23. private:
  24.     WINTIMER_REAL   m_rFreq;
  25.     WINTIMER_REAL   m_rStartTime;
  26.     WINTIMER_REAL   m_rPauseTime;
  27.     WINTIMER_REAL   m_rLastTime;
  28.     WINTIMER_REAL   m_rElaspedTime;
  29.     bool            m_bPaused;

  30.     WINTIMER_INLINE
  31.     double  GetSysTime()
  32.     {
  33.         LARGE_INTEGER li;
  34.         QueryPerformanceCounter(&li);
  35.         return LI2REAL(li)/m_rFreq;
  36.     }
  37. public:
  38.     WINTIMER_INLINE
  39.     WinTimer()
  40.     {
  41.         LARGE_INTEGER li;
  42.         QueryPerformanceFrequency(&li);
  43.         m_rFreq=LI2REAL(li);
  44.         ResetTimer();
  45.     }

  46.     WINTIMER_INLINE
  47.     WinTimer(WINTIMER_REAL Time)
  48.     {
  49.         LARGE_INTEGER li;
  50.         QueryPerformanceFrequency(&li);
  51.         m_rFreq=LI2REAL(li);
  52.         ResetTimer();
  53.         m_rStartTime-=Time;
  54.     }

  55.     WINTIMER_INLINE
  56.     void StartTimer()
  57.     {
  58.         if(m_bPaused)
  59.         {
  60.             m_rStartTime+=GetSysTime()-m_rPauseTime;
  61.             m_bPaused=false;
  62.         }
  63.     }

  64.     WINTIMER_INLINE
  65.     void PauseTimer()
  66.     {
  67.         if(!m_bPaused)
  68.         {
  69.             m_rPauseTime=GetSysTime();
  70.             m_bPaused=true;
  71.         }
  72.     }

  73.     WINTIMER_INLINE
  74.     void ResetTimer()
  75.     {
  76.         m_rStartTime=m_rPauseTime=GetSysTime();
  77.         m_bPaused=true;
  78.         m_rLastTime=0;
  79.         m_rElaspedTime=0;
  80.     }

  81.     WINTIMER_INLINE
  82.     double GetTime()
  83.     {
  84.         if(m_bPaused)
  85.             return m_rPauseTime-m_rStartTime;
  86.         else
  87.             return GetSysTime()-m_rStartTime;
  88.     }

  89.     WINTIMER_INLINE
  90.     void SetTime(WINTIMER_REAL Time)
  91.     {
  92.         m_rStartTime=m_rPauseTime=GetSysTime()-Time;
  93.     }

  94.     WINTIMER_INLINE
  95.     operator WINTIMER_REAL()//直接转换成WINTIMER_REAL
  96.     {
  97.         return GetTime();
  98.     }

  99.     WINTIMER_INLINE
  100.     void UpdateElaspedTime()
  101.     {
  102.         WINTIMER_REAL rNow=GetTime();
  103.         m_rElaspedTime=rNow-m_rLastTime;
  104.         m_rLastTime=rNow;
  105.     }

  106.     WINTIMER_INLINE
  107.     WINTIMER_REAL ElaspedTime()
  108.     {
  109.         return m_rElaspedTime;
  110.     }
  111. };

  112. #endif
复制代码
回复

使用道具 举报

发表于 2014-4-11 11:48:46 | 显示全部楼层
编程风格又改了,先是dos风格,然后是windows风格,现在又参杂了一些old-style c风格
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 02:13 , Processed in 0.033662 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表