#include "Common.h" #include "Object.h" #include "Thread.h" #include "Timer.h" HTimer g_timerGlobal; HTimer::HTimer() : HThread(false, 1024 * 128) // default stack size : 128kb { m_bThreadStarted = false; m_bTerminate = false; struct tm * tmTmp; struct timeb tTimeb; ftime(&tTimeb); tmTmp = localtime(&tTimeb.time); m_systemTime.wYear = tmTmp->tm_year + 1900; m_systemTime.wMonth = tmTmp->tm_mon + 1; m_systemTime.wDay = tmTmp->tm_mday; m_systemTime.wHour = tmTmp->tm_hour; m_systemTime.wMinute = tmTmp->tm_min; m_systemTime.wSecond = tmTmp->tm_sec; m_systemTime.wMilliseconds = tTimeb.millitm; m_nTickCount = ::GetTickCount(); Begin(); // start timer thread while (m_bThreadStarted == false) // wait for thread started Sleep(10); } HTimer::~HTimer() { RemoveAllTimer(); } void HTimer::GetSystemTime(PSYSTEMTIME pSystemTime) { #ifndef SINGLE_THREADED_MODEL m_syncSystemTime.Lock(); #endif memcpy(pSystemTime, (void *)&m_systemTime, sizeof(SYSTEMTIME)); #ifndef SINGLE_THREADED_MODEL m_syncSystemTime.Unlock(); #endif } bool HTimer::SetTimer(unsigned int nTimerID, unsigned int nElapse, void (*fnCallBack)(unsigned int, void *), void * pParam) { struct HTimerObject * pTimerObject = new struct HTimerObject; pTimerObject->nTimerID = nTimerID; pTimerObject->nElapse = nElapse; pTimerObject->dwLastCheckTime = m_nTickCount; pTimerObject->bDelete = false; pTimerObject->fnOnTimerCallBack = fnCallBack; pTimerObject->pOnTimerCallBackParam = pParam; #ifndef SINGLE_THREADED_MODEL // m_sync.Lock(); #endif m_listTimer.push_front(pTimerObject); #ifndef SINGLE_THREADED_MODEL // m_sync.Unlock(); #endif return true; } bool HTimer::KillTimer(unsigned int nTimerID) { struct HTimerObject * pTimerObject; #ifndef SINGLE_THREADED_MODEL // m_sync.Lock(); #endif for(LIST_TIMER_OBJECT::iterator iter = m_listTimer.begin(); iter != m_listTimer.end(); iter++) { pTimerObject = *iter; if (pTimerObject->nTimerID == nTimerID) { #if 0 delete pTimerObject; m_listTimer.erase(iter); #else pTimerObject->bDelete = true; #endif #ifndef SINGLE_THREADED_MODEL // m_sync.Unlock(); #endif return true; } } #ifndef SINGLE_THREADED_MODEL // m_sync.Unlock(); #endif return false; } void HTimer::RemoveAllTimer() { #ifndef SINGLE_THREADED_MODEL // m_sync.Lock(); #endif struct HTimerObject * pTimerObject; for(LIST_TIMER_OBJECT::iterator iter = m_listTimer.begin(); iter != m_listTimer.end(); iter++) { pTimerObject = *iter; delete pTimerObject; } m_listTimer.clear(); #ifndef SINGLE_THREADED_MODEL // m_sync.Unlock(); #endif } void HTimer::Main() { m_bThreadStarted = true; struct tm * tmTmp; struct timeb tTimeb; struct HTimerObject * pTimerObject; while (m_bTerminate == false) { Sleep(HTIMER_INTERVAL_TIME); #ifndef SINGLE_THREADED_MODEL // m_sync.Lock(); #endif for(LIST_TIMER_OBJECT::iterator iter = m_listTimer.begin(); iter != m_listTimer.end(); iter++) { pTimerObject = *iter; if (pTimerObject->bDelete) { delete pTimerObject; iter = m_listTimer.erase(iter); if (iter == m_listTimer.end()) break; } else if (pTimerObject->nElapse <= TimeDiff(pTimerObject->dwLastCheckTime, m_nTickCount)) { if (pTimerObject->fnOnTimerCallBack) pTimerObject->fnOnTimerCallBack(pTimerObject->nTimerID, pTimerObject->pOnTimerCallBackParam); pTimerObject->dwLastCheckTime = m_nTickCount; } } #ifndef SINGLE_THREADED_MODEL // m_sync.Unlock(); #endif ftime(&tTimeb); tmTmp = localtime(&tTimeb.time); #ifndef SINGLE_THREADED_MODEL m_syncSystemTime.Lock(); #endif m_systemTime.wYear = tmTmp->tm_year + 1900; m_systemTime.wMonth = tmTmp->tm_mon + 1; m_systemTime.wDay = tmTmp->tm_mday; m_systemTime.wHour = tmTmp->tm_hour; m_systemTime.wMinute = tmTmp->tm_min; m_systemTime.wSecond = tmTmp->tm_sec; m_systemTime.wMilliseconds = tTimeb.millitm; #ifndef SINGLE_THREADED_MODEL m_syncSystemTime.Unlock(); #endif m_nTickCount = ::GetTickCount(); } }