| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- #include "StdAfx.h"
- #include "TimerEngine.h"
- CAutoLock::CAutoLock(LPCRITICAL_SECTION lpCriticalSetion)
- {
- EnterCriticalSection(lpCriticalSetion);
- m_lpCriticalSetion = lpCriticalSetion;
- }
- CAutoLock::~CAutoLock()
- {
- LeaveCriticalSection(m_lpCriticalSetion);
- }
- //////////////////////////////////////////////////////////////////////////////////
- void WINAPI onTimeFunc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
- {
- CTimerEngine* pThis1 = (CTimerEngine*)dwUser;
- pThis1->OnTimerThreadSink();
- return;
- }
- //////////////////////////////////////////////////////////////////////////////////
- // 构造函数
- CTimerEngine::CTimerEngine()
- {
- // 状态变量
- m_bService = false;
- // 配置变量
- m_dwTimerSpace = 30;
- InitializeCriticalSection(&m_CriticalSection);
- StartService();
- return;
- }
- // 析构函数
- CTimerEngine::~CTimerEngine()
- {
- // 停止服务
- ConcludeService();
- DeleteCriticalSection(&m_CriticalSection);
- // 清理内存
- m_TimerItemFree.clear();
- m_TimerItemActive.clear();
- return;
- }
- // 设置定时器
- bool CTimerEngine::SetTimer(ITimerCallBack* p, DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter)
- {
- // 锁定资源
- CAutoLock ThreadLock(&m_CriticalSection);
- // 效验参数
- ASSERT(dwRepeat > 0L);
- if (dwRepeat == 0)
- return false;
- dwElapse = (dwElapse + m_dwTimerSpace - 1) / m_dwTimerSpace*m_dwTimerSpace;
- // 查找定时器
- bool bTimerExist = false;
- std::shared_ptr<tagTimerItem> pTimerItem = NULL;
- for(auto & it: m_TimerItemActive)
- {
- if (it->pCallBack == p && it->dwTimerID == dwTimerID)
- {
- bTimerExist = true;
- pTimerItem = it;
- break;
- }
- }
- // 创建定时器
- if (bTimerExist == false)
- {
- //使用空闲定时器
- if (!m_TimerItemFree.empty())
- {
- pTimerItem = *m_TimerItemFree.begin();
- m_TimerItemFree.erase(m_TimerItemFree.begin());
- }
- //没有空闲定时器
- else
- {
- try
- {
- pTimerItem = std::shared_ptr<tagTimerItem>(new tagTimerItem);
- ASSERT(pTimerItem != NULL);
- if (pTimerItem == NULL)
- return false;
- }
- catch (...) { return false; }
- }
- }
- // 设置参数
- ASSERT(pTimerItem != NULL);
- pTimerItem->pCallBack = p;
- pTimerItem->dwElapse = dwElapse;
- pTimerItem->dwTimerID = dwTimerID;
- pTimerItem->dwRepeatTimes = dwRepeat;
- pTimerItem->dwBindParameter = dwBindParameter;
- pTimerItem->dwTimeLeave = dwElapse;
- // 激活定时器
- if (bTimerExist == false) m_TimerItemActive.emplace_back(pTimerItem);
- return false;
- }
- // 删除定时器
- bool CTimerEngine::KillTimer(ITimerCallBack* p, DWORD dwTimerID)
- {
- // 锁定资源
- CAutoLock ThreadLock(&m_CriticalSection);
- // 查找定时器
- for(auto it = m_TimerItemActive.begin(); it != m_TimerItemActive.end(); it++)
- {
- // 获取对象
- if ((*it)->pCallBack != p || (*it)->dwTimerID != dwTimerID) continue;
- m_TimerItemFree.push_back(*it);
- // 设置对象
- m_TimerItemActive.erase(it);
- return true;
- }
- return false;
- }
- // 删除定时器
- bool CTimerEngine::KillAllTimer()
- {
- // 锁定资源
- CAutoLock ThreadLock(&m_CriticalSection);
- // 删除定时器
- m_TimerItemFree.splice(m_TimerItemFree.end(), m_TimerItemActive);
- m_TimerItemActive.clear(); //其实也没有数据了
- return true;
- }
- // 开始服务
- bool CTimerEngine::StartService()
- {
- // 状态效验
- ASSERT(m_bService == false);
- if (m_bService == true)
- return false;
- // 启动服务
- m_timerId = timeSetEvent(m_dwTimerSpace, m_dwTimerSpace, &onTimeFunc, DWORD_PTR(this), TIME_PERIODIC);
- // 设置变量
- m_bService = true;
- return true;
- }
- // 停止服务
- bool CTimerEngine::ConcludeService()
- {
- // 设置变量
- m_bService = false;
- //关闭定时器
- timeKillEvent(m_timerId);
- // 删除定时器
- KillAllTimer();
- return true;
- }
- // 定时器通知
- VOID CTimerEngine::OnTimerThreadSink()
- {
- // 锁定资源
- CAutoLock ThreadLock(&m_CriticalSection);
- // 倒计时间
- if (m_TimerItemActive.empty())
- {
- return;
- }
- // 变量定义
- bool bKillTimer = false;
- // 时间搜索
- for (auto it = m_TimerItemActive.begin(); it != m_TimerItemActive.end(); )
- {
- // 获取对象
- std::shared_ptr<tagTimerItem> pTimerItem = *it;
- // 设置变量
- bKillTimer = false;
- if (pTimerItem->dwTimeLeave <= m_dwTimerSpace)
- {
- pTimerItem->dwTimeLeave = 0;
- }
- else
- pTimerItem->dwTimeLeave -= m_dwTimerSpace;
- // 通知判断
- if (pTimerItem->dwTimeLeave == 0L)
- {
- // 发送通知
- ASSERT(pTimerItem->pCallBack != NULL);
- pTimerItem->pCallBack->TimerCallBack(pTimerItem->dwTimerID, pTimerItem->dwBindParameter);
- // 设置次数
- if (pTimerItem->dwRepeatTimes != TIMES_INFINITY)
- {
- if (pTimerItem->dwRepeatTimes == 1L)
- {
- bKillTimer = true;
- m_TimerItemFree.push_back(*it);
- it = m_TimerItemActive.erase(it);
- }
- else pTimerItem->dwRepeatTimes--;
- }
- // 设置时间
- if (bKillTimer == false) pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
- }
- // 增加索引
- if (bKillTimer == false)
- {
- it++;
- }
- }
- return;
- }
- CTimerEngine* CTimerEngine::GetInstance()
- {
- static CTimerEngine g_TimerInstance;
- return &g_TimerInstance;
- }
- //////////////////////////////////////////////////////////////////////////////////
|