#pragma warning( disable : 4786 ) #include "Caldron.h" #include "./LoadedObj.h" #include "ResourceLoader.h" namespace Caldron {namespace Base { /* ********************************************************************* * CResourceLoaderObj * ÆÄÀÏ : ResourceLoader.cpp * ±â´É : Caldron Engine³» CResourceLoader ¿¡¼­ Load Queue¿¡ µé¾î°¥ resource ´ÜÀ§ * ÀÛ¼ºÀÏ : 2004.01.06 * history : wizardbug ( 2004.01.06) ********************************************************************** */ CResourceLoaderObj::CResourceLoaderObj() { m_pObj = NULL; m_State = RLOBJSTATE_READY; } CResourceLoaderObj::CResourceLoaderObj(const char *strFileName,CLoadedObj *pObj) { strcpy(m_strFileName,strFileName); m_pObj = pObj; m_pObj->m_bLoaded = false; m_State = RLOBJSTATE_READY; } CResourceLoaderObj::~CResourceLoaderObj() { } /* ********************************************************************* * CResourceLoader * ÆÄÀÏ : ResourceLoader.cpp * ±â´É : Caldron Engine³» ResourceLoader, thread¸¦ ºÐ¸®ÇÏ¿© ¸Þ¸° ·çƾ °ú ·Îµù·çƾÀ» ºÐ¸® ÇÏ¿´´Ù. * ÀÛ¼ºÀÏ : 2004.01.06 * history : wizardbug ( 2004.01.06) ********************************************************************** */ DWORD WINAPI LoaderThreadProc(LPVOID lpParam) { CResourceLoader *pLoader = (CResourceLoader *)(lpParam); pLoader->LoaderFunc(); return 0; } DWORD WINAPI ProcessThreadProc(LPVOID lpParam) { CResourceLoader *pLoader = (CResourceLoader *)(lpParam); pLoader->ProcessFunc(); return 0; } CResourceLoader::CResourceLoader() : m_Queue(g_iMaxLoaderQueue) { m_bLoading = false; m_dwWait = 0; m_lstObj.clear(); m_lstReady.clear(); InitializeCriticalSection(&m_ObjCriticalSection); m_LoaderThreadID = m_ProcessThreadID = 0; m_EndEvent = CreateEvent(NULL, TRUE, FALSE, NULL); m_LoaderHandle = 0; m_ProcessHandle = 0; } CResourceLoader::~CResourceLoader() { DeleteCriticalSection(&m_ObjCriticalSection); CloseHandle(m_EndEvent); CloseHandle(m_LoaderHandle); CloseHandle(m_ProcessHandle); } void CResourceLoader::Loading() { m_bLoading = true; // Event ÃʱâÈ­ ResetEvent(m_EndEvent); if((m_LoaderHandle = CreateThread(NULL,0,LoaderThreadProc,(LPVOID)this,0,&m_LoaderThreadID)) == NULL) { CLogMgr::_LogError("CResourceLoader::Loading() : Create Loader Thread Failed"); } if((m_ProcessHandle = CreateThread(NULL,0,ProcessThreadProc,(LPVOID)this,0,&m_ProcessThreadID)) == NULL) { CLogMgr::_LogError("CResourceLoader::Loading() : Create Process Thread Failed"); } } DWORD CResourceLoader::WaitFinished() { return WaitForMultipleObjects(1, &m_EndEvent, FALSE, m_dwWait); } int CResourceLoader::FinishPercent() { return 0; } void CResourceLoader::LoaderFunc() { for(int iIndex = 0; iIndex < GetObjNum(); iIndex++) { CResourceLoaderObj *pObj = &m_lstObj[iIndex]; if(!(pObj->m_ByteData.LoadByte(pObj->m_strFileName))) { pObj->m_State = RLOBJSTATE_FAILED; if(pObj->m_pObj) pObj->m_pObj->m_bLoaded = false; } else { pObj->m_State = RLOBJSTATE_LOADING; m_Queue.PushBack(pObj); } } m_Queue.Terminate(); } void CResourceLoader::ProcessFunc() { CResourceLoaderObj *pObj = NULL; while( m_Queue.RemoveFront(pObj)) { if((pObj) && (pObj->m_pObj)) { if(!pObj->m_pObj->Load(&(pObj->m_ByteData))) { // ·Îµù ½ÇÆÐ½Ã¿¡ ´Ù½Ã queue¿¡ ³Ö¾î¼­ ReLoading ½Ãµµ ÇÑ´Ù. if(pObj->m_pObj->m_iReloadingCount < Caldron::MAX_RELOADING) { pObj->m_State = RLOBJSTATE_LOADING; pObj->m_pObj->m_bLoaded = false; m_Queue.PushBack(pObj); CLogMgr::_LogError("CResourceLoader::ProcessFunc: Load fail, Reloading."); pObj->m_pObj->m_iReloadingCount++; } else { pObj->m_State = RLOBJSTATE_FAILED; pObj->m_pObj->m_bLoaded = true; } } else { pObj->m_State = RLOBJSTATE_LOADED; pObj->m_pObj->m_bLoaded = true; } } else { CLogMgr::_LogError("CResourceLoader::ProcessFunc: Obj Ptr is NULL"); } } SetEvent(m_EndEvent); } int CResourceLoader::AddObj(CResourceLoaderObj &Obj) { if(!m_bLoading) { EnterCriticalSection(&m_ObjCriticalSection); m_lstObj.push_back(Obj); LeaveCriticalSection(&m_ObjCriticalSection); return (int)(m_lstObj.size()); } else { m_lstReady.push_back(Obj); return -2; } } CResourceLoaderObj CResourceLoader::GetObj(int iIndex) { EnterCriticalSection(&m_ObjCriticalSection); CResourceLoaderObj Obj = m_lstObj[iIndex]; LeaveCriticalSection(&m_ObjCriticalSection); return Obj; } void CResourceLoader::SetObj(int iIndex,CResourceLoaderObj &Obj) { EnterCriticalSection(&m_ObjCriticalSection); m_lstObj[iIndex] = Obj; LeaveCriticalSection(&m_ObjCriticalSection); } int CResourceLoader::GetObjNum() { EnterCriticalSection(&m_ObjCriticalSection); int iNum = (int)m_lstObj.size(); LeaveCriticalSection(&m_ObjCriticalSection); return iNum; } void CResourceLoader::ClearAllObj() { EnterCriticalSection(&m_ObjCriticalSection); m_lstObj.clear(); LeaveCriticalSection(&m_ObjCriticalSection); } CResourceLoaderObjState CResourceLoader::GetObjState(int iIndex) { return m_lstObj[iIndex].m_State; } bool CResourceLoader::Finished() { if(WaitFinished() != (WAIT_OBJECT_0)) return false; CloseHandle(m_LoaderHandle); CloseHandle(m_ProcessHandle); m_LoaderHandle = m_ProcessHandle = 0; return true; } void CResourceLoader::Process() { if((m_bLoading == true) && WaitFinished() == (WAIT_OBJECT_0)) { m_bLoading = false; ClearAllObj(); CloseHandle(m_LoaderHandle); CloseHandle(m_ProcessHandle); m_LoaderHandle = m_ProcessHandle = 0; } else { if((m_lstObj.size() > 0 )&& (m_bLoading == false)) Loading(); return; } if(m_lstReady.size() > 0 && !m_bLoading) { // Ready Å¥¿¡ µé¾î ÀÖ´Â °ÍµéÀ» ·Îµù ¸®½ºÆ®·Î ³Ñ±ä´Ù m_lstObj.reserve(m_lstReady.size()); std::copy(m_lstReady.begin(),m_lstReady.end(),std::back_inserter(m_lstObj)); m_lstReady.clear(); Loading(); } } }}