// ThreadQueue.h: interface for the CThreadQueue class. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_) #define AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "Caldron.h" #include "./LogMgr.h" /* ********************************************************************* * CThreadQueue * ÆÄÀÏ : ThreadQueue.cpp * ±â´É : * ÀÛ¼ºÀÏ : 2004.01.09 * history : wizardbug ( 2004.01.09) ********************************************************************** */ namespace Caldron { namespace Base { enum CALDRONTHREADEVENT_ID { CALDRONTHREAD_SEMAPHORE = 0, CALDRONTHREAD_TERMINATE, }; template class CThreadQueue { public: CThreadQueue(int iMaxQueueSize) { InitializeCriticalSection(&m_CriticalSection); m_Handle[CALDRONTHREAD_SEMAPHORE] = CreateSemaphore(NULL,0,iMaxQueueSize,NULL); m_Handle[CALDRONTHREAD_TERMINATE] = CreateEvent(NULL,TRUE,FALSE,NULL); } virtual ~CThreadQueue() { DeleteCriticalSection(&m_CriticalSection); CloseHandle(m_Handle[CALDRONTHREAD_SEMAPHORE]); CloseHandle(m_Handle[CALDRONTHREAD_TERMINATE]); } bool PushBack(T Obj) { EnterCriticalSection(&m_CriticalSection); m_Queue.push(Obj); // semaphore count Áõ°¡ bool bResult = (ReleaseSemaphore(m_Handle[CALDRONTHREAD_SEMAPHORE],1,NULL) != 0); if(!bResult) { m_Queue.pop(); // pop()Àº °¡Àå ¸¶Áö¸·¿¡ ´Ù·é°ÍÀ» remove ½ÃŲ´Ù. CLogMgr::_LogError("CThreadQueue::PushBack() : Queue is Full~!"); } LeaveCriticalSection(&m_CriticalSection); return bResult; } bool RemoveFront(T &Obj) { bool bResult = false; // Semarphore ¿¡ ½×ÀÎ ¸¸Å­ Return °ªÀÇ °¹¼ö°¡ µé¾î°£´Ù CALDRONTHREADEVENT_ID ReturnID = (CALDRONTHREADEVENT_ID)WaitForMultipleObjects(2,m_Handle,FALSE,INFINITE); if(ReturnID == CALDRONTHREAD_SEMAPHORE) { bResult = true; EnterCriticalSection(&m_CriticalSection); if(m_Queue.size()) { Obj = m_Queue.front(); m_Queue.pop(); // pop()Àº °¡Àå ¸¶Áö¸·¿¡ ´Ù·é°ÍÀ» remove ½ÃŲ´Ù. } else { CLogMgr::_LogError("CThreadQueue::RemoveFront() : Queue is Empty~!"); bResult = false; } LeaveCriticalSection(&m_CriticalSection); return true; } return false; } void Terminate() { SetEvent(m_Handle[CALDRONTHREAD_TERMINATE]); } void UnTerminate() { ResetEvent(m_Handle[CALDRONTHREAD_TERMINATE]); } protected: HANDLE m_Handle[2]; CRITICAL_SECTION m_CriticalSection; std::queue m_Queue; }; } } #endif // !defined(AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_)