Magic_Game/Easy2D/Tool/Timer.cpp

184 lines
3.2 KiB
C++
Raw Normal View History

2017-09-10 23:56:52 +08:00
#include "..\Easy2d.h"
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static std::vector<Timer*> s_nTimers;
Timer::Timer(tstring name, UINT ms, const TIMER_CALLBACK & callback) :
m_sName(name),
m_bRunning(false),
m_callback(callback)
{
setInterval(ms); // <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
Timer::~Timer()
{
}
void Timer::start()
{
// <20><>־<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
this->m_bRunning = true;
// <20><>¼<EFBFBD><C2BC>ǰʱ<C7B0><CAB1>
QueryPerformanceCounter(&m_nLast);
}
void Timer::stop()
{
this->m_bRunning = false; // <20><>־<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֹͣ
}
bool Timer::isRunning()
{
return m_bRunning; // <20><>ȡ<EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
}
void Timer::setInterval(UINT ms)
{
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LARGE_INTEGER nFreq;
QueryPerformanceFrequency(&nFreq);
m_nAnimationInterval.QuadPart = (LONGLONG)(ms / 1000.0 * nFreq.QuadPart);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
this->m_nMilliSeconds = ms;
}
void Timer::setCallback(const TIMER_CALLBACK & callback)
{
m_callback = callback; // <20><><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
}
void Timer::setName(tstring name)
{
m_sName = name; // <20>޸Ķ<DEB8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
UINT Timer::getInterval() const
{
return m_nMilliSeconds; // <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
tstring Timer::getName() const
{
return m_sName; // <20><>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void Timer::__exec()
{
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
if (!s_nTimers.size())
{
return;
}
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
static LARGE_INTEGER nNow;
QueryPerformanceCounter(&nNow);
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĶ<D0B5>ʱ<EFBFBD><CAB1>
for (auto timer : s_nTimers)
{
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>δ<EFBFBD><CEB4><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (!timer->m_bRunning)
{
continue;
}
// <20>ж<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>
if (nNow.QuadPart - timer->m_nLast.QuadPart > timer->m_nAnimationInterval.QuadPart)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>¼ʱ<C2BC><CAB1>
timer->m_nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % timer->m_nAnimationInterval.QuadPart);
// <20><><EFBFBD>лص<D0BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
timer->m_callback();
}
}
}
void Timer::addTimer(Timer * timer)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
timer->start();
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_nTimers.push_back(timer);
}
void Timer::addTimer(tstring name, UINT ms, const TIMER_CALLBACK & callback)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
auto timer = new Timer(name, ms, callback);
// <20><><EFBFBD>Ӷ<EFBFBD>ʱ<EFBFBD><CAB1>
addTimer(timer);
}
Timer * Timer::getTimer(tstring name)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1>
for (auto timer : s_nTimers)
{
if (timer->m_sName == name)
{
// <20><><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظö<D8B8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
return timer;
}
}
// <20><>δ<EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؿ<EFBFBD>ָ<EFBFBD><D6B8>
return nullptr;
}
bool Timer::startTimer(tstring name)
{
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ö<EFBFBD>ʱ<EFBFBD><CAB1>
auto t = getTimer(name);
if (t)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
t->start();
return true;
}
// <20><>δ<EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
return false;
}
bool Timer::stopTimer(tstring name)
{
// ָֹͣ<D6B9><D6B8><EFBFBD><EFBFBD><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>ö<EFBFBD>ʱ<EFBFBD><CAB1>
auto t = getTimer(name);
if (t)
{
// ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1>
t->stop();
return true;
}
// <20><>δ<EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
return false;
}
2017-09-20 14:52:50 +08:00
bool Timer::delTimer(tstring name)
2017-09-10 23:56:52 +08:00
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<Timer*>::iterator iter;
// ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
for (iter = s_nTimers.begin(); iter != s_nTimers.end(); iter++)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1>
if ((*iter)->m_sName == name)
{
// ɾ<><C9BE><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>
delete (*iter);
s_nTimers.erase(iter);
return true;
}
}
// <20><>δ<EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>ƵĶ<C6B5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
return false;
}
void Timer::clearAllTimers()
{
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>
for (auto t : s_nTimers)
{
delete t;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s_nTimers.clear();
}