201 lines
3.9 KiB
C++
201 lines
3.9 KiB
C++
|
|
#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();
|
|
}
|
|
}
|