Files
2026-05-20 03:08:08 +09:00

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();
}
}