#include "TimerTaskEngine.h"
#include <process.h>
#include <assert.h>
enum eTime
{
ePRECISION = 32, //定时器精度,越小精度越高当然消耗CPU越高,根据实际情况调整
eTHREAD_TIME_OUT = 1024, //线程超时时间
};
CTimerTaskEngine::CTimerTaskEngine()
{}
CTimerTaskEngine::~CTimerTaskEngine()
{}
bool CTimerTaskEngine::Start()
{
InitializeCriticalSection( &m_TimerDetailsLock );
InitializeCriticalSection( &m_ExcuteTasksQueueLock );
m_hStopEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
m_hTaskEvent = CreateSemaphore( NULL, 0, 0xFFFF, NULL );
if( NULL == m_hStopEvent || NULL == m_hTaskEvent )
{
assert( false );
return false;
}
m_pThread = new HANDLE[ 2 ];
m_pThread[ 0 ] = reinterpret_cast< HANDLE >( _beginthreadex( NULL, 0, EngineThread, this, 0, NULL ) );
m_pThread[ 1 ] = reinterpret_cast< HANDLE >( _beginthreadex( NULL, 0, ExcuteTaskThread, this, 0, NULL ) );
if( NULL == m_pThread[ 0 ] || NULL == m_pThread[ 1 ] )
{
assert( false );
return false;
}
return true;
}
bool CTimerTaskEngine::Stop()
{
SetEvent( m_hStopEvent );
if( WAIT_TIMEOUT == WaitForMultipleObjects( 2, m_pThread, TRUE, eTHREAD_TIME_OUT ) )
{
TerminateThread( m_pThread[ 0 ], 0 );
TerminateThread( m_pThread[ 1 ], 0 );
}
CloseHandle( m_pThread[ 0 ] );
CloseHandle( m_pThread[ 1 ] );
CloseHandle( m_hTaskEvent );
CloseHandle( m_hStopEvent );
delete [] m_pThread;
m_pThread = NULL;
m_TimerDetailsMap.clear();
while( false == m_ExcuteTasksQueue.empty() )
{
m_ExcuteTasksQueue.pop();
}
DeleteCriticalSection( &m_TimerDetailsLock );
DeleteCriticalSection( &m_ExcuteTasksQueueLock );
return true;
}
bool CTimerTaskEngine::AddTask( ITask* pTask, DWORD dwTimerID, DWORD dwInterval /*= 1000*/, DWORD dwTimes /*= 1*/, DWORD dwParam /*= 0 */)
{
if( NULL == pTask )
{
assert( false );
return false;
}
TimerTaskDetail timer;
timer.m_TimerID = dwTimerID;
timer.m_Interval = dwInterval;
timer.m_Times = dwTimes;
timer.m_Param = dwParam;
timer.m_Tick = GetTickCount();
EnterCriticalSection( &m_TimerDetailsLock );
auto timerDetails = m_TimerDetailsMap.equal_range( pTask );
bool bFind = false;
for( auto it = timerDetails.first; it != timerDetails.second; ++it )
{
if( it->second.m_TimerID == dwTimerID )
{
memcpy_s( &it->second, sizeof( it->second ), &timer, sizeof( timer ) );
bFind = true;
break;
}
}
if( false == bFind )
{
m_TimerDetailsMap.insert( std::make_pair( pTask, timer ) );
}
LeaveCriticalSection( &m_TimerDetailsLock );
return true;
}
bool CTimerTaskEngine::RemoveTask( ITask* pTask, DWORD dwTimerID )
{
if( NULL == pTask )
{
assert( false );
return false;
}
EnterCriticalSection( &m_TimerDetailsLock );
auto timerDetails = m_TimerDetailsMap.equal_range( pTask );
for( auto it = timerDetails.first; it != timerDetails.second; ++it )
{
if( it->second.m_TimerID == dwTimerID )
{
m_TimerDetailsMap.erase( it );
break;
}
}
LeaveCriticalSection( &m_TimerDetailsLock );
return true;
}
bool CTimerTaskEngine::ExcuteTask( ITask* pTask, DWORD dwTimerID, DWORD dwParam )
{
TimerTask timerTask = { pTask, dwTimerID, dwParam };
EnterCriticalSection( &m_ExcuteTasksQueueLock );
m_ExcuteTasksQueue.push( timerTask );
LeaveCriticalSection( &m_ExcuteTasksQueueLock );
if( FALSE == ReleaseSemaphore( m_hTaskEvent, 1, NULL ) )
{
assert( false );
return false;
}
return true;
}
UINT WINAPI CTimerTaskEngine::EngineThread(LPVOID pVoid)
{
CTimerTaskEngine *pThis = static_cast<CTimerTaskEngine*>(pVoid);
HANDLE &waitObject = pThis->m_hStopEvent;
TimerDetailsMap &timerDetails = pThis->m_TimerDetailsMap;
CRITICAL_SECTION &lock = pThis->m_TimerDetailsLock;
while (true)
{
switch (WaitForSingleObject(waitObject, ePRECISION))
{
case WAIT_OBJECT_0:
{
return 0;
}
break;
case WAIT_TIMEOUT:
{
EnterCriticalSection(&lock);
for (auto it = timerDetails.begin(); it != timerDetails.end(); )
{
if (GetTickCount() - it->second.m_Tick < it->second.m_Interval)
{
++it;
continue;
}
pThis->ExcuteTask(it->first, it->second.m_TimerID, it->second.m_Param);
it->second.m_Tick = GetTickCount();
if (INFINITE == it->second.m_Times)
{
++it;
continue;
}
--it->second.m_Times;
if (0 == it->second.m_Times)
{
it = timerDetails.erase(it);
continue;
}
++it;
}
LeaveCriticalSection(&lock);
}
break;
default:
{
assert(false);
return 0;
}
break;
}
}
return 0;
}
UINT WINAPI CTimerTaskEngine::ExcuteTaskThread(LPVOID pVoid)
{
CTimerTaskEngine *pThis = static_cast< CTimerTaskEngine* >( pVoid );
HANDLE waitObjects[] = { pThis->m_hStopEvent, pThis->m_hTaskEvent };
std::queue< TimerTask > &tasksQueue = pThis->m_ExcuteTasksQueue;
CRITICAL_SECTION &lock = pThis->m_ExcuteTasksQueueLock;
TimerTask timerTask = {};
while( true )
{
switch( WaitForMultipleObjects( 2, waitObjects, FALSE, INFINITE ) )
{
case WAIT_OBJECT_0:
{
return 0;
}
break;
case WAIT_OBJECT_0 + 1:
{
EnterCriticalSection( &lock );
memcpy_s( &timerTask, sizeof( timerTask ), &tasksQueue.front(), sizeof( tasksQueue.front() ) );
tasksQueue.pop();
LeaveCriticalSection( &lock );
timerTask.m_pTask->ExcuteTask( timerTask.m_TimerID, timerTask.m_Param );
}
break;
default:
{
assert( false );
return 0;
}
break;
}
}
return 0;
}

C++老师机
- 粉丝: 15
最新资源
- 网络工程师学习笔记共享共章.doc
- 中国物流供需与中国物流网络.doc
- 基于单片机的电子钟设计.doc
- 基于FPGA的SPI接口设计-徐慧军.doc
- 计算机教师总结.docx
- 微软学科培训-学员手册2014.6.doc
- 基于单片机的步进电机控制系统汇编及C语言程序各一个样本.doc
- 小学生网络安全黑板报.docx
- 数字图像处理入门.ppt
- 计算机专业实习调研报告.doc
- 网络舆情工作总结范文合集.doc
- 计算机网络基础考试试题4(最终).doc
- 软件需求说明书.doc
- 信息化发展战略选择课件.pptx
- 微机原理与接口技术吉海彦主编机械工业出版社课后习题答案.doc
- 网络优化暑期社会实践心得体会.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



- 1
- 2
- 3
前往页