📄 waitqueue.cpp
字号:
// WaitQueue.cpp: implementation of the CWaitQueue class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "appserver.h"
#include "WaitQueue.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CWaitQueue::CWaitQueue()
{
m_pHead = NULL;
m_pTail = NULL;
m_nLength = 0;
}
CWaitQueue::~CWaitQueue()
{
RemoveAll();
}
void CWaitQueue::RemoveAll()
{
WAITBUF * pBuf;
cs.Lock();
while (pBuf = m_pHead)
{
m_pHead = pBuf->m_pNext;
delete pBuf;
m_nLength --;
}
m_pTail = NULL;
cs.Unlock();
}
BOOL CWaitQueue::Insert(INT nChannel, INT nTicks)
{
WAITBUF * pBuf, * pTemp;
cs.Lock();
for (pTemp = m_pHead; pTemp; pTemp = pTemp->m_pNext)
{
if (pTemp->m_nChannel == nChannel)
{
cs.Unlock();
return FALSE;
}
}
pTemp = NULL;
pBuf = NULL;
/*
for (pTemp = m_pHead; pTemp; pTemp = pTemp->m_pNext)
{
if (pTemp->m_nTicks > 20)
{
int nSignError = 10;
nSignError = 10 + 20;
}
if (pTemp->m_nTicks >= nTicks)
{
pTemp->m_nTicks -= nTicks;
if (pTemp->m_nTicks > 20)
{
int nSignError = 10;
nSignError = 10 + 20;
}
break;
}
else
{
nTicks -= pTemp->m_nTicks;
}
}
*/
if (pTemp)
{
pBuf = new WAITBUF;
pBuf->m_nChannel = pTemp->m_nChannel;
pBuf->m_nTicks = pTemp->m_nTicks;
if (pTemp->m_nTicks == 500)
{
pTemp->m_nTicks = 10;
}
pBuf->m_pNext = pTemp->m_pNext;
if (m_pTail == pTemp)
{
m_pTail = pBuf;
}
}
else
{
pBuf = NULL;
pTemp = new WAITBUF;
if (m_pHead == NULL)
{
m_pHead = pTemp;
}
else
{
m_pTail->m_pNext = pTemp;
}
m_pTail = pTemp;
}
pTemp->m_nChannel = nChannel;
pTemp->m_nTicks = nTicks;
if (pTemp->m_nTicks == 500)
{
pTemp->m_nTicks = 10;
}
pTemp->m_pNext = pBuf;
m_nLength ++;
cs.Unlock();
return TRUE;
}
BOOL CWaitQueue::DecHead(INT& nChannel)
{
WAITBUF * pBuf;
cs.Lock();
if (m_pHead)
{
if (m_pHead->m_nTicks == 500)
{
m_pHead->m_nTicks = 10;
}
if (m_pHead->m_nTicks > 0)
m_pHead->m_nTicks --;
if (m_pHead->m_nTicks == 0)
{
nChannel = m_pHead->m_nChannel;
pBuf = m_pHead;
m_pHead = pBuf->m_pNext;
if (m_pHead == NULL)
m_pTail = NULL;
delete pBuf;
m_nLength --;
cs.Unlock();
return TRUE;
}
}
cs.Unlock();
return FALSE;
}
BOOL CWaitQueue::Remove(INT nChannel)
{
WAITBUF * pBuf, * pBuf0;
cs.Lock();
if (m_pHead == NULL)
{
cs.Unlock();
return FALSE;
}
if (m_pHead->m_nChannel == nChannel)
{
pBuf = m_pHead;
m_pHead = pBuf->m_pNext;
delete pBuf;
if (m_pHead == NULL)
m_pTail = NULL;
m_nLength --;
cs.Unlock();
return TRUE;
}
pBuf0 = m_pHead;
for (pBuf = pBuf0->m_pNext; pBuf; pBuf = pBuf0->m_pNext)
{
if (pBuf->m_nChannel == nChannel)
break;
pBuf0 = pBuf;
}
if (pBuf == NULL)
{
cs.Unlock();
return FALSE;
}
pBuf0->m_pNext = pBuf->m_pNext;
if (m_pTail == pBuf)
m_pTail = pBuf0;
delete pBuf;
m_nLength --;
cs.Unlock();
return TRUE;
}
INT CWaitQueue::RemoveHead()
{
WAITBUF * pBuf;
INT nChannel;
cs.Lock();
if (m_pHead == NULL)
{
cs.Unlock();
return -1;
}
nChannel = m_pHead->m_nChannel;
pBuf = m_pHead;
m_pHead = pBuf->m_pNext;
if (m_pHead == NULL)
m_pTail = NULL;
delete pBuf;
m_nLength --;
cs.Unlock();
return nChannel;
}
BOOL CWaitQueue::Update(INT nChannel, INT nTicks)
{
WAITBUF * pTemp;
cs.Lock();
for (pTemp = m_pHead; pTemp; pTemp = pTemp->m_pNext)
{
if (pTemp->m_nChannel == nChannel)
{
if (pTemp->m_nTicks == 500)
{
pTemp->m_nTicks = 10;
}
pTemp->m_nTicks = nTicks;
cs.Unlock();
return TRUE;
}
}
cs.Unlock();
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -