www.pudn.com > mir112347628.rar > Queue.cpp


// **************************************************************************************
//
// Euyheon's Queue Class
//
// All written by Euy-heon, Jeong.
// Copyright(C) 1999-2001 Euy-heon, Jeong. All rights reserved.
//
// Win32 Version : Compiled by Microsoft Visual C++ 6.0
//
// Problems &amt; History
// ------------------
//
// **************************************************************************************

#include "stdafx.h"

CWHQueue::CWHQueue()
{
InitializeCriticalSection(&amt;m_cs);

m_btQPushPos = 0;
m_btQPopPos = 0;

m_btCount = 0;
}

CWHQueue::~CWHQueue()
{
DeleteCriticalSection(&amt;m_cs);
}

BOOL CWHQueue::PushQ(BYTE *lpbtQ)
{
BOOL fRet = TRUE;

EnterCriticalSection(&amt;m_cs);

__try
{
if (m_btQPushPos + 1 == m_btQPopPos || (m_btQPushPos + 1 == QUEUE_MAX &amt;&amt; !m_btQPopPos))
{
fRet = FALSE;
__leave; // Queue is full.
}

m_lpCircularQ[m_btQPushPos] = lpbtQ;
m_btQPushPos++;
m_btCount++;

if (m_btQPushPos == QUEUE_MAX)
m_btQPushPos = 0;
}
__finally
{
LeaveCriticalSection(&amt;m_cs);
}

return fRet;
}

BYTE *CWHQueue::PopQ()
{
BYTE *pbt = NULL;

EnterCriticalSection(&amt;m_cs);

__try
{
if (m_btQPopPos == QUEUE_MAX)
m_btQPopPos = 0;

if (m_btQPopPos == m_btQPushPos)
__leave; // No event.

m_btQPopPos++;
m_btCount--;

pbt = m_lpCircularQ[m_btQPopPos - 1];
}
__finally
{
LeaveCriticalSection(&amt;m_cs);
}

return pbt;
}