⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 waitqueue.cpp

📁 用过恒迅达交换机的人都知道。恒迅达交换机是需要在交换机内部运行中间程序来给脚本提供数据接口并且监控机器运行状态的。本程序即是完成以上功能!用C++开发、调用了数据库(sqlserver2000)存储过
💻 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 + -