Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
2.7 KiB
C++
109 lines
2.7 KiB
C++
// 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 T>
|
|
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<T> m_Queue;
|
|
|
|
};
|
|
}
|
|
}
|
|
#endif // !defined(AFX_THREADQUEUE_H__D6165646_A901_43B4_BABC_5237337D0BFD__INCLUDED_)
|