|
- #include "StdAfx.h"
- #include "TimerEngine.h"
- #include "TraceService.h" //
-
- //宏定义
- #define NO_TIME_LEFT DWORD(-1) //不响应时间
-
- //////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CTimerThread::CTimerThread(void)
- {
- m_pTimerEngine = NULL;
- }
-
- //析构函数
- CTimerThread::~CTimerThread(void)
- {
- }
-
- //配置函数
- bool CTimerThread::InitThread(CTimerEngine * pTimerEngine)
- {
- if (pTimerEngine == NULL) return false;
-
- //设置变量
- m_pTimerEngine = pTimerEngine;
-
- return true;
- }
-
- //运行函数
- bool CTimerThread::OnEventThreadRun()
- {
- ASSERT(m_pTimerEngine != NULL);
-
- DWORD dwNow = ::timeGetTime();
- m_pTimerEngine->OnTimerThreadSink(dwNow);
- Sleep(1);
-
- // Sleep(TIMER_SPACE); //magiii 12/04/01/ Sleep误差太大,太不靠谱了,改成上面的方式
- // m_pTimerEngine->OnTimerThreadSink();
- return true;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- //构造函数
- CTimerEngine::CTimerEngine(void)
- {
- m_bService = false;
- m_pIQueueServiceSink = NULL;
- }
-
- //析构函数
- CTimerEngine::~CTimerEngine(void)
- {
- INT_PTR i = 0;
- //停止服务
- ConcludeService();
-
- //清理内存
- tagTimerItem * pTimerItem = NULL;
- for (i = 0; i < m_TimerItemFree.GetCount(); i++)
- {
- pTimerItem = m_TimerItemFree[i];
- ASSERT(pTimerItem != NULL);
- SafeDelete(pTimerItem);
- }
- for (i = 0; i < m_TimerItemActive.GetCount(); i++)
- {
- pTimerItem = m_TimerItemActive[i];
- ASSERT(pTimerItem != NULL);
- SafeDelete(pTimerItem);
- }
- m_TimerItemFree.RemoveAll();
- m_TimerItemActive.RemoveAll();
-
- return;
- }
-
- //接口查询
- void * CTimerEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
- {
- QUERYINTERFACE(ITimerEngine, Guid, dwQueryVer);
- QUERYINTERFACE_IUNKNOWNEX(ITimerEngine, Guid, dwQueryVer);
- return NULL;
- }
-
- //设置定时器
- bool CTimerEngine::SetTimer(DWORD dwTimerID, DWORD dwElapse, DWORD dwRepeat, WPARAM dwBindParameter)
- {
- //锁定资源
- CWHDataLocker lock(m_CriticalSection);//
-
- //效验参数
- ASSERT(dwRepeat > 0L);
- if (dwRepeat == 0) return false;
-
- //查找定时器
- bool bTimerExist = false;
- tagTimerItem * pTimerItem = NULL;
- for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++)
- {
- pTimerItem = m_TimerItemActive[i];
- ASSERT(pTimerItem != NULL);
- if (pTimerItem->wTimerID == dwTimerID)
- {
- bTimerExist = true;
- break;
- }
- }
-
- //创建定时器
- if (bTimerExist == false)
- {
- INT_PTR nFreeCount = m_TimerItemFree.GetCount();
- if (nFreeCount > 0)
- {
- pTimerItem = m_TimerItemFree[nFreeCount - 1];
- ASSERT(pTimerItem != NULL);
- m_TimerItemFree.RemoveAt(nFreeCount - 1);
- }
- else
- {
- try
- {
- pTimerItem = new tagTimerItem;
- ASSERT(pTimerItem != NULL);
- if (pTimerItem == NULL) return false;
- }
- catch (...)
- {
- return false;
- }
- }
- }
-
- //设置参数
- ASSERT(pTimerItem != NULL);
- pTimerItem->wTimerID = dwTimerID;
- pTimerItem->wBindParam = dwBindParameter;
- pTimerItem->dwElapse = dwElapse;
- pTimerItem->dwRepeatTimes = dwRepeat;
-
- //提前20个粒度进行通知 - TIMER_SPACE * 20
- //if (pTimerItem->dwRepeatTimes == 1)
- // pTimerItem->dwTimeLeave = __max(TIMER_SPACE, pTimerItem->dwElapse - TIMER_SPACE * 20);
- //else
- // pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
- pTimerItem->dwTimeStart = ::timeGetTime();
-
- //激活定时器
- if (bTimerExist == false)
- m_TimerItemActive.Add(pTimerItem);
-
- return true;
- }
-
- //删除定时器
- bool CTimerEngine::KillTimer(DWORD dwTimerID)
- {
- //锁定资源
- CWHDataLocker lock(m_CriticalSection);//
-
- //查找定时器
- tagTimerItem * pTimerItem = NULL;
- for (INT_PTR i = 0; i < m_TimerItemActive.GetCount(); i++)
- {
- pTimerItem = m_TimerItemActive[i];
- ASSERT(pTimerItem != NULL);
- if (pTimerItem->wTimerID == dwTimerID)
- {
- m_TimerItemActive.RemoveAt(i);
- m_TimerItemFree.Add(pTimerItem);
- return true;;
- }
- }
-
- return false;
- }
-
- //删除定时器
- bool CTimerEngine::KillAllTimer()
- {
- //锁定资源
- CWHDataLocker lock(m_CriticalSection);//
-
- //删除定时器
- m_TimerItemFree.Append(m_TimerItemActive);
- m_TimerItemActive.RemoveAll();
-
- return true;
- }
-
- //开始服务
- bool CTimerEngine::StartService()
- {
- //效验状态
- if (m_bService == true)
- {
- CTraceService::TraceString(TEXT("定时器引擎重复启动,启动操作忽略"), TraceLevel_Warning);
- return true;
- }
-
- //设置变量
- if (m_TimerThread.InitThread(this) == false)
- {
- CTraceService::TraceString(TEXT("定时器引擎线程服务初始化失败"), TraceLevel_Exception);
- return false;
- }
-
- //启动服务
- if (m_TimerThread.StartThread() == false)
- {
- CTraceService::TraceString(TEXT("定时器引擎线程服务启动失败"), TraceLevel_Exception);
- return false;
- }
-
- SetThreadPriority(m_TimerThread.GetThreadHandle(), REALTIME_PRIORITY_CLASS);
-
-
- //设置变量
- m_bService = true;
-
- return true;
- }
-
- //停止服务
- bool CTimerEngine::ConcludeService()
- {
- //设置变量
- m_bService = false;
-
- //停止线程
- m_TimerThread.ConcludeThread(INFINITE);
-
- //设置变量
- m_TimerItemFree.Append(m_TimerItemActive);
- m_TimerItemActive.RemoveAll();
-
- return true;
- }
-
- //删除空闲定时器
- bool CTimerEngine::KillAllFreeTimer()
- {
- //锁定资源
- CWHDataLocker lock(m_CriticalSection);//
-
- //清理内存
- tagTimerItem * pTimerItem = NULL;
- for (int i = 0; i < m_TimerItemFree.GetCount(); i++)
- {
- pTimerItem = m_TimerItemFree[i];
- ASSERT(pTimerItem != NULL);
- SafeDelete(pTimerItem);
- }
- m_TimerItemFree.RemoveAll();
-
- return true;
- }
-
- //设置接口
- bool CTimerEngine::SetTimerEngineEvent(IUnknownEx * pIUnknownEx)
- {
- //效验参数
- ASSERT(pIUnknownEx != NULL);
- ASSERT(m_bService == false);
- if (m_bService == true) return false;
- if (pIUnknownEx == NULL) return false;
-
- //设置接口
- ASSERT(pIUnknownEx != NULL);
- m_pIQueueServiceSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IQueueServiceSink);
- ASSERT(m_pIQueueServiceSink != NULL);
- return (m_pIQueueServiceSink != NULL);
- }
-
- //定时器通知
- void CTimerEngine::OnTimerThreadSink(DWORD dwNow)
- {
- //缓冲锁定
- CWHDataLocker lock(m_CriticalSection);//
-
- //查询定时器
- tagTimerItem * pTimerItem = NULL;
- for (INT_PTR i = m_TimerItemActive.GetCount() - 1; i >= 0; i--)
- {
- //效验参数
- pTimerItem = m_TimerItemActive[i];
- ASSERT(pTimerItem != NULL);
- if (pTimerItem == NULL) continue;
- //ASSERT(pTimerItem->dwTimeLeave > 0);
-
- //定时器处理
- bool bKillTimer = false;
- //pTimerItem->dwTimeLeave -= TIMER_SPACE;
- //if (pTimerItem->dwTimeLeave < TIMER_SPACE)
- if (CalSubTime(pTimerItem->dwTimeStart, dwNow) >= pTimerItem->dwElapse)
- {
- try
- {
- // BYTE cbBuffer[MAX_ASYNCHRONISM_DATA] = { 0 }; //接收缓冲
- //投递消息
- NTY_TimerEvent TimerEvent;
- TimerEvent.dwTimerID = pTimerItem->wTimerID;
- TimerEvent.dwBindParameter = pTimerItem->wBindParam;
-
- //magiii 12/04/09/ 先删除,再处理,不然如果在处理的过程中有settimer,会有问题
- //设置次数
- if (pTimerItem->dwRepeatTimes != TIMES_INFINITY)
- {
- ASSERT(pTimerItem->dwRepeatTimes > 0);
- pTimerItem->dwRepeatTimes--;
- if (pTimerItem->dwRepeatTimes == 0L)
- {
- bKillTimer = true;
- m_TimerItemActive.RemoveAt(i);
- m_TimerItemFree.Add(pTimerItem);
- }
- }
-
- m_pIQueueServiceSink->OnQueueServiceSink(EVENT_TIMER, &TimerEvent, sizeof(NTY_TimerEvent));
- }
- catch (...) {}
-
- //设置时间
- if (bKillTimer == false)//提前20个粒度进行通知 - TIMER_SPACE * 20
- {
- //if (pTimerItem->dwRepeatTimes == 1)
- // pTimerItem->dwTimeLeave = __max(TIMER_SPACE, pTimerItem->dwElapse - TIMER_SPACE * 10);
- //else
- // pTimerItem->dwTimeLeave = pTimerItem->dwElapse;
- pTimerItem->dwTimeStart = ::timeGetTime();
- }
- }
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- //建立对象函数
- extern "C" __declspec(dllexport) void * __cdecl CreateTimerEngine(const GUID & Guid, DWORD dwInterfaceVer)
- {
- //建立对象
- CTimerEngine * pTimerEngine = NULL;
- try
- {
- pTimerEngine = new CTimerEngine();
- if (pTimerEngine == NULL) throw TEXT("创建失败");
- void * pObject = pTimerEngine->QueryInterface(Guid, dwInterfaceVer);
- if (pObject == NULL) throw TEXT("接口查询失败");
- return pObject;
- }
- catch (...) {}
-
- //清理对象
- SafeDelete(pTimerEngine);
- return NULL;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- DWORD CTimerEngine::CalSubTime(DWORD timeStart, DWORD timeEnd)
- {
- if (timeEnd < timeStart)
- return ((DWORD)0XFFFFFFFF - timeStart) + timeEnd;
- else
- return timeEnd - timeStart;
- }
-
- //////////////////////////////////////////////////////////////////////////
|