📄 cmpqueue.cpp
字号:
#include <windows.h>
#include "CMPqueue.h"
using namespace MatrixCore::Network;
//HANDLE hPushEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
#define QUEUESIZE 300000
/////////////////////////////////////////////////////////////////////////////////////////////////
//
//
/////////////////////////////////////////////////////////////////////////////////////////////////
//class CMPackQueue : public CMObject
//{
//private:
// struct _QUEUE_DATA
// {
// int iNum;
// T Temp;
// };
//
// CRITICAL_SECTION m_PushCS;
// CRITICAL_SECTION m_PopCS;
// _QUEUE_DATA* m_pBuf;
// _QUEUE_DATA* m_pHeadPos; // 单捞鸥啊 唱哎荐 乐绰 器牢磐.
// _QUEUE_DATA* m_pTailPos; // 单捞鸥啊 甸绢 哎荐 乐绰 器牢磐.
// volatile long m_nPackSize; // 单捞鸥啊 割俺 甸绢 乐绰瘤.
// INT m_nHead, m_nTail; // 庆歹客 部府狼 惑措利 困摹蔼
//public:
// CMPackQueue();
// virtual ~CMPackQueue();
//
// BOOL push( T* pPushData ) throw( CMPackQueueAbortException* );
// BOOL pop( T* pPopData ) throw( CMPackQueueAbortException* );
// BOOL isEmpty();
// VOID empty();
// inline INT size() { return m_nPackSize; }
//};
//-------------------------------------------------------------------------------------------------------
// Name :: CMPQueue()
// Create Date :: 2003/12/17
// Description :: 积己磊
// param ::
// Return Value ::
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
CMPQueue::CMPQueue()
{
m_pBuf = (_PointData *) new _PointData[QUEUESIZE];
if( m_pBuf == NULL)
{
//::MessageBox
return ;
}
for(int i = 0; i < QUEUESIZE ; i++)
{
m_pBuf[i].iNum = i;
m_pBuf[i].iSize = 0;
memset(&m_pBuf[i].pPointData,0,sizeof(m_pBuf[i].pPointData));
}
m_pHeadPos = m_pBuf;
m_pTailPos = m_pBuf;
m_nPackSize = 0;
//农府萍拿 冀记 檬扁拳.
InitializeCriticalSection(&m_PushCS);
InitializeCriticalSection(&m_PopCS);
}
//-------------------------------------------------------------------------------------------------------
// Name :: ~CMPQueue()
// Create Date :: 2003/12/17
// Description :: 家戈磊
// param ::
// Return Value ::
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
CMPQueue::~CMPQueue()
{
DeleteCriticalSection(&m_PushCS);
DeleteCriticalSection(&m_PopCS);
}
//-------------------------------------------------------------------------------------------------------
// Name :: PointPush()
// Create Date :: 2003/12/17
// Description :: 钮俊 单捞鸥甫 笼绢持绰促.
// param ::
// void* pPushData : void 器牢磐屈
// int iSize : 菩哦 辨捞..
// Return Value :: 力措肺 甸绢啊搁 TRUE
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
BOOL CMPQueue::PointPush(SOCKET s,void* pPushData , int iSize )
{
__try {
EnterCriticalSection( &m_PushCS );
m_pTailPos->pPointData = pPushData;
m_pTailPos->s = s;
m_pTailPos->iSize = iSize;
m_nTail = m_pTailPos->iNum;
//钮 付瘤阜俊 持菌促 促矫 贸澜何磐 笼绢 持绰促..
if(m_nTail == QUEUESIZE-1)
{
m_pTailPos = m_pBuf;
m_nTail = 0;
}
else
{
// 促澜俊 持阑荐 困摹肺 器牢磐 捞悼
m_pTailPos++;
}
// 滴俺 鞍捞 遏 吧府绰 何盒 吝夸
InterlockedIncrement(&m_nPackSize);
// if(InterlockedCompareExchange(&m_nPackSize,1,1) == 1)
// SetEvent(hPushEvent);
}
__finally
{
LeaveCriticalSection( &m_PushCS );
}
return TRUE;
}
//-------------------------------------------------------------------------------------------------------
// Name :: PointPop()
// Create Date :: 2003/12/17
// Description :: 钮俊辑 扑阑 茄促.
// param ::
// Return Value :: 镜荐 乐绰 钮甫 哗辰促.
// (林狼!) 咯扁辑 钮甫 波辰促绊 钮俊 单捞鸥啊 绝绢瘤瘤 臼绰促.
// 弊钮甫 馆券 沁阑锭 钮俊 单捞鸥啊 扑等促.
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
_PointData* CMPQueue::PointPop()
{
_PointData *PopData ;
__try {
EnterCriticalSection( &m_PopCS );
if(InterlockedCompareExchange(&m_nPackSize,0,0) == 0)
{
// WaitForSingleObjectEx(hPushEvent,INFINITE,FALSE);
// ::ResetEvent(hPushEvent);
::Sleep(1); // 荤侩磊 单捞鸥啊 拌加 绝阑锭 檬寸 500锅沥档 倒歹焙 -_-;;
return NULL;
}
//PopData.pPointData = m_pHeadPos->pPointData;
////memcpy(pPopData,&m_pHeadPos->pPointData,sizeof(T));
////strcpy(pPopData,&m_pHeadPos->Temp);
//PopData.iNum = m_nHead = m_pHeadPos->iNum;
//PopData.iSize = m_pHeadPos->iSize;
PopData = m_pHeadPos;
//钮 付瘤阜俊辑 佬菌促 促矫 贸澜何磐 笼绢 持绰促..
if(m_nHead == QUEUESIZE-1)
{
m_pHeadPos = m_pBuf;
m_nHead = 0;
}
else
{
// 促澜俊 持阑荐 困摹肺 器牢磐 捞悼
m_pHeadPos++;
m_nHead++;
}
// 滴俺 鞍捞 遏 吧府绰 何盒 吝夸
::InterlockedDecrement(&m_nPackSize);
}
__finally
{
LeaveCriticalSection( &m_PopCS );
}
return PopData;
}
BOOL CMPQueue::PointReturn(_PointData* pRtnData)
{
if(pRtnData == NULL)
return FALSE;
return TRUE;
}
//-------------------------------------------------------------------------------------------------------
// Name :: IsEmpty()
// Create Date :: 2003/12/17
// Description :: 钮俊 单捞鸥啊 乐绰瘤甫 八荤茄促.
// param ::
// Return Value :: 钮俊 单捞鸥啊 茄俺扼档 乐促搁 FASLE
// 茄俺档 绝促搁.. TRUE
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
BOOL CMPQueue::IsEmpty()
{
if( m_nPackSize == 0)
return TRUE;
return FALSE;
}
//-------------------------------------------------------------------------------------------------------
// Name :: Empty()
// Create Date :: 2003/12/17
// Description :: 皋葛府甫 檬扁拳 矫挪促.
// param ::
// Return Value ::
// Bug Report ::
//-------------------------------------------------------------------------------------------------------
void CMPQueue::Empty()
{
__try {
EnterCriticalSection( &m_PopCS );
EnterCriticalSection( &m_PushCS );
for(int i = 0; i < QUEUESIZE ; i++)
{
m_pBuf[i].iNum = i;
m_pBuf[i].iSize = 0;
memset(&m_pBuf[i].pPointData,0,sizeof(m_pBuf[i].pPointData));
}
m_nHead = 0;
m_nTail = 0;
m_nPackSize = 0;
m_pHeadPos = m_pBuf;
m_pTailPos = m_pBuf;
}
__finally
{
LeaveCriticalSection( &m_PopCS );
LeaveCriticalSection( &m_PushCS );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -