7 // static
\83\81\83\93\83o
\r
8 int CTimer::nRefCount = 0;
\r
9 int CTimer::timerType = TIMERTYPE_GETTICKCOUNT;
\r
10 TIMECAPS CTimer::dwTimeCaps;
\r
11 LARGE_INTEGER CTimer::liFrequency;
\r
12 //double CTimerEx::dbTimeGetTime = 0;
\r
14 void CTimer::Init( int timerType )
\r
16 //
\8dÅ
\8f\89\82Ì
\83C
\83\93\83X
\83^
\83\93\83X
\82È
\82ç
\81A
\91S
\83C
\83\93\83X
\83^
\83\93\83X
\8b¤
\92Ê
\82Ì
\8f\89\8aú
\89»
\82ð
\8ds
\82¤
\81B
\r
17 if( this->nRefCount == 0 )
\r
19 //
\8eg
\97p
\82·
\82é
\83^
\83C
\83}
\82ð
\8c\88\92è
\82·
\82é
\r
22 //
\82`
\81D
\8d\82\90¸
\93x
\83^
\83C
\83}
\r
23 //
\82c
\81D
\96¢
\92è
\8b`
\r
24 case TIMERTYPE_PERFORMANCECOUNTER:
\r
25 case TIMERTYPE_UNKNOWN:
\r
26 if( CheckAndSetA_HighPerformanceTimer() ) break;
\r
27 if( CheckAndSetB_MultimediaTimer() ) break;
\r
31 //
\82a
\81D
\83}
\83\8b\83`
\83\81\83f
\83B
\83A
\83^
\83C
\83}
\r
32 case TIMERTYPE_TIMEGTTIME:
\r
33 if( CheckAndSetB_MultimediaTimer() ) break;
\r
34 if( CheckAndSetA_HighPerformanceTimer() ) break;
\r
38 //
\82»
\82Ì
\91¼
\81D
\8b\8c\8e®
\83^
\83C
\83}
\r
45 Reset(); //
\83^
\83C
\83}
\83\8a\83Z
\83b
\83g
\r
46 this->nRefCount++; //
\8eQ
\8fÆ
\83J
\83E
\83\93\83g
\91\9d\89Á
\r
49 bool CTimer::CheckAndSetA_HighPerformanceTimer()
\r
51 if( ::QueryPerformanceFrequency( &liFrequency ) )
\r
53 CTimer::timerType = TIMERTYPE_PERFORMANCECOUNTER;
\r
59 bool CTimer::CheckAndSetB_MultimediaTimer()
\r
61 if( ::timeGetDevCaps( &dwTimeCaps, sizeof( TIMECAPS ) ) == TIMERR_NOERROR && dwTimeCaps.wPeriodMin < 10 )
\r
63 CTimer::timerType = TIMERTYPE_TIMEGTTIME;
\r
64 ::timeBeginPeriod( dwTimeCaps.wPeriodMin );
\r
70 bool CTimer::SetC_OldTimer()
\r
72 CTimer::timerType = TIMERTYPE_GETTICKCOUNT;
\r
73 dwTimeCaps.wPeriodMax = 1; //
\90¸
\93x1ms
\81i
\82Ì
\82Â
\82à
\82è
\82É
\82È
\82é
\81j
\r
79 //
\8eQ
\8fÆ
\83J
\83E
\83\93\83g
\8c¸
\8f
\r
82 //
\83C
\83\93\83X
\83^
\83\93\83X
\82ª
\82È
\82
\82È
\82Á
\82½
\82ç
\8fI
\97¹
\8f\88\97\9d\r
83 if( this->nRefCount == 0 )
\r
85 if( this->timerType == TIMERTYPE_TIMEGTTIME )
\r
86 ::timeEndPeriod( this->dwTimeCaps.wPeriodMin );
\r
90 void CTimer::Reset()
\r
92 this->dbOffsetTime = this->dbPauseTime = GetTime();
\r
96 double CTimer::Get()
\r
98 return ( this->nPaused > 0 ) ? (this->dbPauseTime - this->dbOffsetTime) : (GetTime() - this->dbOffsetTime);
\r
101 void CTimer::Set( double dbTime )
\r
103 this->dbOffsetTime = ( this->nPaused > 0 ) ? (this->dbPauseTime - dbTime) : (GetTime() - dbTime);
\r
106 void CTimer::Pause()
\r
108 if ( this->nPaused++ == 0 )
\r
109 this->dbPauseTime = GetTime();
\r
112 void CTimer::Restart()
\r
114 if ( --this->nPaused == 0)
\r
115 this->dbOffsetTime += GetTime() - this->dbPauseTime;
\r
118 double CTimer::GetTime()
\r
120 switch( CTimer::timerType )
\r
122 case TIMERTYPE_GETTICKCOUNT:
\r
123 return (double) ::GetTickCount();
\r
125 case TIMERTYPE_TIMEGTTIME:
\r
126 return (double) ::timeGetTime();
\r
128 case TIMERTYPE_PERFORMANCECOUNTER:
\r
130 double dbNow = 0.0;
\r
131 if( liFrequency.QuadPart != 0 )
\r
133 LARGE_INTEGER liNowTime;
\r
134 ::QueryPerformanceCounter( &liNowTime );
\r
135 dbNow = liNowTime.QuadPart / ( liFrequency.QuadPart / 1000.0 );
\r