#include "StdAfx.h" #include #include "TaskManager.h" #include "Task.h" #include "FrameSync.h" CTaskManager::CTaskManager( CMultiRoom *pRoom ) : CMultiSingleton( pRoom ) { m_bLockDebugTask = false; } CTaskManager::~CTaskManager() { for( DWORD i=0; im_dwHandle ); --i; } } DWORD CTaskManager::AddTask( CTask *pTask, const char *szName, int nSecureFrame, bool bUseThread ) { static DWORD dwCounter = 0; m_pVecTaskList.push_back( pTask ); pTask->m_dwHandle = dwCounter; ++dwCounter; pTask->m_bUseThread = bUseThread; pTask->ResetTimer(); pTask->m_pFrameSync->Begin( ( m_bLockDebugTask == true ) ? 60 : nSecureFrame ); pTask->SetTaskName( szName ); if( bUseThread == true ) { pTask->m_hThreadHandle = (HANDLE)_beginthreadex( NULL, 65536, BeginThread, (void*)pTask, 0, &pTask->m_dwThreadID ); } // if( strcmp( szName, "GameTask" ) == NULL ) TaskEnum::GameTask = (int)m_pVecTaskList.size() - 1; return pTask->m_dwHandle; } void CTaskManager::RemoveAllTask() { for( DWORD i=0; im_bUseThread == true ) { m_pVecTaskList[i]->m_bUseThread = false; CloseHandle( m_pVecTaskList[i]->m_hThreadHandle ); } } SAFE_DELETE_PVEC( m_pVecTaskList ); } void CTaskManager::RemoveTask( DWORD dwTaskHandle ) { for( DWORD i=0; im_dwHandle == dwTaskHandle ) { if( m_pVecTaskList[i]->m_bUseThread == true ) { m_pVecTaskList[i]->m_bUseThread = false; CloseHandle( m_pVecTaskList[i]->m_hThreadHandle ); } m_pVecTaskList.erase( m_pVecTaskList.begin() + i ); return; } } } void CTaskManager::RemoveTask( const char *szName ) { CTask *pTask = GetTask( szName ); if( !pTask ) return; RemoveTask( pTask->m_dwHandle ); } CTask *CTaskManager::GetTask( DWORD dwTaskHandle ) { for( DWORD i=0; im_dwHandle == dwTaskHandle ) return m_pVecTaskList[i]; } return NULL; } CTask *CTaskManager::GetTask( const char *szName ) { for( DWORD i=0; iGetTaskName(), szName ) ) return m_pVecTaskList[i]; } return NULL; } bool CTaskManager::Excute() { for( DWORD i=0; im_bUseThread == false ) { CTask *pTask = m_pVecTaskList[i]; if( !pTask->IsEnableTaskProcess() ) continue; if( pTask->m_pFrameSync->CheckSync() ) { LOCAL_TIME LocalTime = pTask->m_pFrameSync->GetMSTime(); float fDelta = ( LocalTime - pTask->GetPrevLocalTime() ) / 1000.f; pTask->SetLocalTime( LocalTime ); pTask->SetDeltaTime( fDelta ); pTask->Process( LocalTime, fDelta ); if( pTask->m_bResetTimer ) { pTask->m_bResetTimer = false; continue; } pTask->SetPrevLocalTime( LocalTime ); } pTask->m_pFrameSync->UpdateTime( ( m_bLockDebugTask == true ) ? 60 : 0 ); if( pTask->m_bDestroyTask == true ) { RemoveTask( pTask->m_dwHandle ); i--; if( pTask->m_bDeleteThis ) SAFE_DELETE( pTask ); } } } if( m_pVecTaskList.empty() ) return false; return true; } UINT __stdcall CTaskManager::BeginThread( void *pParam ) { CTask *pTask = (CTask*)pParam; while(1) { if( pTask->m_bUseThread == false ) { OutputDebug( "Thread Exit : %x\n", &pTask ); return 0; } if( pTask->m_bDestroyTask == true ) { CTaskManager::GetInstance( pTask->GetRoom() ).RemoveTask( pTask->m_dwHandle ); if( pTask->m_bDeleteThis ) SAFE_DELETE( pTask ); OutputDebug( "Thread Exit : %x\n", &pTask ); return 0; } if( !pTask->IsEnableTaskProcess() ) continue; if( pTask->m_pFrameSync->CheckSync() ) { LOCAL_TIME LocalTime = pTask->m_pFrameSync->GetMSTime(); float fDelta = ( LocalTime - pTask->GetPrevLocalTime() ) / 1000.f; pTask->SetLocalTime( LocalTime ); pTask->SetDeltaTime( fDelta ); pTask->Process( LocalTime, fDelta ); pTask->SetPrevLocalTime( LocalTime ); } pTask->m_pFrameSync->UpdateTime(); Sleep(1); } return 0; }