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

📄 msglist.cpp

📁 Visual C++ 游戏开发与设计实例 源代码(所有)
💻 CPP
字号:

#include "global.h"
#include "msglist.h"


CRITICAL_SECTION 	g_SyncFlag;

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgList::CMsgList() {
	m_ppElems = NULL;

	m_nSize = 0;
	m_nHead = 0;
	m_nTail = 0;
	m_nTotal = 0;
	m_nMax = MAXLIST;

	m_bSync = false;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgList::~CMsgList() {
	DestroyList();
	if ( m_bSync )
		DeleteCriticalSection( &g_SyncFlag );
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMsgList::DestroyList() {
//	if( m_ppElems )			// cause unkown memory error
//		delete[] m_ppElems;
//	m_ppElems = NULL;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool CMsgList::CreatMsgList( unsigned int size, bool sync ) {
	if ( size < 0 || size > MAXLIST )
		return false;

	m_ppElems = (CMsgElem **)(new LPVOID[size]);		// alloc memory
	if ( !m_ppElems )
		return false;
	m_nSize = size;
	
	if ( sync ) {						// init sync flag
		m_bSync = true;
		InitializeCriticalSection( &g_SyncFlag );
	}
	return true;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMsgList::Lock() { 
	if ( m_bSync )
		EnterCriticalSection( &g_SyncFlag ); 
}
 
//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
void CMsgList::UnLock()	{
	if ( m_bSync )
		LeaveCriticalSection( &g_SyncFlag ); 
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgElem *CMsgList::Pop() {
	if ( IsEmpty() || NotInit() ) 
		return NULL;

	CMsgElem	*pelem = m_ppElems[m_nTail];
	m_ppElems[m_nTail] = NULL;
	INCSCOPE( m_nTail, 0, m_nSize+1 );	// move pointer forward
	m_nTotal--;							// reduce total number
	
	return pelem;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgElem *CMsgList::Peek() {
	if ( IsEmpty() || NotInit() ) 
		return NULL;

	return m_ppElems[m_nTail];
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool CMsgList::Push( const CMsgElem *pelem ) {
	if ( NotInit() ) 
		return false;

	if ( IsFull() && !EnlargeSize() )
		return false;

	m_ppElems[m_nHead] = new CMsgElem();
	if ( !m_ppElems[m_nHead] )
		return false;
	m_ppElems[m_nHead]->m_nMsg = pelem->m_nMsg;
	m_ppElems[m_nHead]->m_dwMsgType = pelem->m_dwMsgType;
	m_ppElems[m_nHead]->m_nParamSize = pelem->m_nParamSize;
	m_ppElems[m_nHead]->m_psBuffer = new char[pelem->m_nParamSize];
	if ( !(m_ppElems[m_nHead]->m_psBuffer) ) {
		delete m_ppElems[m_nHead];
		return false;
	}
	memcpy( m_ppElems[m_nHead]->m_psBuffer, pelem->m_psBuffer, 
		pelem->m_nParamSize );

	INCSCOPE( m_nHead, 0, m_nSize+1 );	// move pointer forward
	m_nTotal++;							// increase total number
	return true;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool CMsgList::EnlargeSize() {
	if ( m_nSize >= m_nMax || NotInit() )
		return false;

	int	newsize = INCSTEP + m_nSize;
	if ( newsize > m_nMax)
		newsize = m_nMax;

	CMsgElem	**temp = (CMsgElem **)(new LPVOID[m_nSize]);
	if ( !temp )
		return false;
	memcpy ( temp, m_ppElems, m_nSize*sizeof(LPVOID) );
//	delete[] m_ppElems;

	m_ppElems = (CMsgElem **)(new LPVOID[newsize]);
	if ( !m_ppElems )
		return false;
	int size = m_nSize - m_nTail;
	memcpy( m_ppElems, temp+m_nTail, size*sizeof(LPVOID) );
	memcpy( m_ppElems+size, temp, m_nTail*sizeof(LPVOID) );
//	delete[] temp;

	m_nTail = 0;
	m_nHead = m_nSize;
	m_nSize = newsize;
	return true;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgElem::CMsgElem() {
	m_nMsg = 0;
	m_dwMsgType = 0;

	m_nParamSize = 0;
	m_psBuffer = NULL;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
CMsgElem::~CMsgElem() {
	if ( !m_psBuffer )
		delete[] m_psBuffer;
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool CMsgElem::CreateMsgElem( int msg, LPCSTR param, int size, DWORD type ) {
	if ( param && size > 0 ) {
		m_psBuffer = new char[size];
		if ( !m_psBuffer )
			return false;
		
		memcpy( m_psBuffer, param, size );
		m_nParamSize = size;
	}
	else {
		if ( !m_psBuffer ) {
			delete[] m_psBuffer;
			m_psBuffer = NULL;
		}
		m_nParamSize = 0;
	}

	m_nMsg = msg;
	m_dwMsgType = type;
	return true;
}


//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------
bool CMsgElem::CreateMsgElemFromBuf( LPCSTR buf, int &size, DWORD type ) {
	int		*piParam = (int *)buf;
	size = piParam[1] + sizeof(int)*2;
	return CreateMsgElem( piParam[0], (LPCSTR)(piParam+2), piParam[1], type );
}

//-----------------------------------------------------------------------------
// Name: 
// Desc: 
//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -