#ifndef __TIMER_H__ #define __TIMER_H__ //======================================================================================================================= /// Timer Ŭ·¡½º /** @history - 2005.2.28 : [taiyo] Timer based time À¸·Î ¹Ù²Ù¾ú´Ù! - 2007.7.19 : [taiyo] ITimer, SimpleTimer ±¸Çö, ÃßÈÄ Timer¸¦ ITimer¸¦ »ó¼Ó¹Þ°Ô ó¸®ÇÒ°ÍÀÓ */ //======================================================================================================================= #pragma once namespace util { class ITimer { public: ITimer(){} virtual ~ITimer(){} virtual void Clear() {} virtual void Reset( DWORD dwIntervalTime = 0 ) {} virtual void SetTimer( DWORD dwIntervalTime ) {} // manual mode virtual bool IsExpired( bool bReset = true ) { return false; } // auto mode virtual bool IsExpiredAuto( bool bReset = true ){ return false; } virtual DWORD GetExpireTime() { return 0; } virtual DWORD GetIntervalTime() { return 0; } virtual DWORD GetRemainedime() { return 0; } virtual DWORD GetProcessTime() { return 0; } virtual void IncreasingExpireTime( DWORD dwAddExpireTime ) {} // range : [0, 1] virtual float GetProgressRatio() { return 0.f; } }; class SimpleTimer : public ITimer { public: SimpleTimer():m_dwExpireTime(0){} virtual ~SimpleTimer(){} virtual void Clear() { m_dwExpireTime=0; } virtual void Reset( DWORD dwIntervalTime ) { m_dwExpireTime = GetTickCount() + dwIntervalTime; } virtual void SetTimer( DWORD dwIntervalTime ) { Reset( dwIntervalTime ); } // only manual mode virtual bool IsExpired( bool bReset = false/*not used*/ ) { bReset; if( m_dwExpireTime && GetTickCount() >= m_dwExpireTime ) { m_dwExpireTime=0; return true; } else return false; } virtual DWORD GetExpireTime() { return m_dwExpireTime; } virtual DWORD GetRemainedTime() { DWORD dwRemainedTime = 0; if( m_dwExpireTime > (dwRemainedTime=GetTickCount()) ) return ( m_dwExpireTime- dwRemainedTime ); else return 0; } virtual void IncreasingExpireTime( DWORD dwAddExpireTime ) { m_dwExpireTime += dwAddExpireTime; } private: DWORD m_dwExpireTime; }; class Timer { public: Timer():m_dwExpireTime(0), m_dwBaseIntervalTime(0), m_bCheckTime(false), m_iBonusIntervalTime(0), m_startTime(GetTickCount()) {} ~Timer(){} public: inline void Clear() { m_dwExpireTime=m_dwBaseIntervalTime=0; m_bCheckTime=false; m_iBonusIntervalTime = 0; } inline void SetTimer( DWORD dwIntervalTime ) { m_dwBaseIntervalTime = dwIntervalTime; m_iBonusIntervalTime = 0; Reset(); } inline DWORD GetBaseIntervalTime() { return m_dwBaseIntervalTime; } inline DWORD GetIntervalTime() { int iIntervalTime = max( 0, (int)m_dwBaseIntervalTime + m_iBonusIntervalTime ); return iIntervalTime; } inline void SetBonusIntervalTime( int iBonusIntervalTime ) { m_iBonusIntervalTime = iBonusIntervalTime; } // m_dwBaseIntervalTime ½Ã°£ °£°ÝÀ» ±×´ë·Î À¯ÁöÇÏ°í ´Ù½Ã Å¸À̸Ӹ¦ µ¹¸°´Ù. inline void Reset(/*m_dwBaseIntervalTime*/) { m_dwExpireTime = GetTickCount() + GetIntervalTime(); EnableCheckTime(); } // ŸÀ̸Ӹ¦ resume inline VOID EnableCheckTime() { m_bCheckTime = true; } // ŸÀ̸Ӹ¦ ÁßÁöÇÑ´Ù. inline VOID DisableCheckTime() { m_bCheckTime = false; } inline VOID IncreasingExpireTime( DWORD dwAddExpireTime ) { m_dwExpireTime += dwAddExpireTime; } // ¸¸·áŸÀÓÀÌ µÇ±â±îÁöÀÇ ÇöÀç ÁøÇà·ü float GetProgressRatio() { int iProcessTime = GetTickCount() - (m_dwExpireTime - GetIntervalTime()); return min( 1.0f, (float)iProcessTime / GetIntervalTime() ); } // ¿Ï·áµÇ±â ±îÁö ³²Àº ½Ã°£ ( ´ÜÀ§ ms ) inline DWORD GetRemainedTime() { DWORD dwRemainedTime = 0; if( m_bCheckTime && m_dwExpireTime > (dwRemainedTime=GetTickCount()) ) return (m_dwExpireTime-dwRemainedTime); else return 0; } // ŸÀÌ¸Ó ½ÃÀÛÈÄ ÁøÇàµÈ ½Ã°£ inline DWORD GetProcessTotalTime() { return GetTickCount() - m_startTime; } // ¸¸·á½Ã°£ Àü±îÁöÀÇ ÁøÇàµÈ ½Ã°£ inline DWORD GetProcessTime() { int iProcessTime = GetTickCount() - (m_dwExpireTime - GetIntervalTime()); if( iProcessTime >= 0 ) return iProcessTime; else return 0; } // problem : ÀÌ ÇÔ¼ö¸¦ °¡²û È£ÃâÇÒ °æ¿ì IsExpired() == TRUE°¡ µÇ´Â °æ¿ì°¡ »ý±ä´Ù. // ¿Ö³ª¸é 1 TickÀÌ¶óµµ ¿ÀÂ÷°¡ »ý±âÁö ¾Ê±â À§ÇØ IsExpired()È£ÃâÇÑ ½Ã°£À» Àû¿ëÇÏÁö ¾Ê´Â´Ù. // Therefore, ÀÌ·²°æ¿ì IsExpired() == TRUEµÈ ÈÄ¿¡ Reset()¸¦ Çѹø È£ÃâÇØ ÁØ´Ù! inline BOOL IsExpired( BOOL bReset=TRUE ) { DWORD dwCurTime; if( m_bCheckTime && ( dwCurTime = GetTickCount() ) >= m_dwExpireTime ) { if( bReset ) { m_dwExpireTime = dwCurTime + m_dwBaseIntervalTime; } return TRUE; } else return FALSE; } // Çѹø¸¸ ŸÀ̸Ӹ¦ µ¹¸®±â À§ÇØ inline BOOL IsExpiredManual( BOOL bReset=TRUE ) { DWORD dwCurTime; if( m_bCheckTime && ( dwCurTime = GetTickCount() ) >= m_dwExpireTime ) { if( bReset ) { m_dwExpireTime = dwCurTime + m_dwBaseIntervalTime; } DisableCheckTime(); return TRUE; } else return FALSE; } void InitCoolTime(DWORD dwExpireTime=0) { m_dwExpireTime = dwExpireTime; } inline DWORD GetExpireTime() { return m_dwExpireTime; } private: DWORD m_startTime; DWORD m_dwExpireTime; DWORD m_dwBaseIntervalTime; bool m_bCheckTime; int m_iBonusIntervalTime; }; }//End of namespace util #endif //__TIMER_H__