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

📄 unibus.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
#include "stdafx.h"
#include "global.h"
#include "HopeKingDatabase.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
unsigned short CRC_Tab[256]=
	 {0x0000,0xc0c1,0xc181,0x0140,0xc301,0x03c0,0x0280,0xc241,
	  0xc601,0x06c0,0x0780,0xc741,0x0500,0xc5c1,0xc481,0x0440,
	  0xcc01,0x0cc0,0x0d80,0xcd41,0x0f00,0xcfc1,0xce81,0x0e40,
	  0x0a00,0xcac1,0xcb81,0x0b40,0xc901,0x09c0,0x0880,0xc841,
	  0xd801,0x18c0,0x1980,0xd941,0x1b00,0xdbc1,0xda81,0x1a40,
	  0x1e00,0xdec1,0xdf81,0x1f40,0xdd01,0x1dc0,0x1c80,0xdc41,
	  0x1400,0xd4c1,0xd581,0x1540,0xd701,0x17c0,0x1680,0xd641,
	  0xd201,0x12c0,0x1380,0xd341,0x1100,0xd1c1,0xd081,0x1040,
	  0xf001,0x30c0,0x3180,0xf141,0x3300,0xf3c1,0xf281,0x3240,
	  0x3600,0xf6c1,0xf781,0x3740,0xf501,0x35c0,0x3480,0xf441,
	  0x3c00,0xfcc1,0xfd81,0x3d40,0xff01,0x3fc0,0x3e80,0xfe41,
	  0xfa01,0x3ac0,0x3b80,0xfb41,0x3900,0xf9c1,0xf881,0x3840,
	  0x2800,0xe8c1,0xe981,0x2940,0xeb01,0x2bc0,0x2a80,0xea41,
	  0xee01,0x2ec0,0x2f80,0xef41,0x2d00,0xedc1,0xec81,0x2c40,
	  0xe401,0x24c0,0x2580,0xe541,0x2700,0xe7c1,0xe681,0x2640,
	  0x2200,0xe2c1,0xe381,0x2340,0xe101,0x21c0,0x2080,0xe041,
	  0xa001,0x60c0,0x6180,0xa141,0x6300,0xa3c1,0xa281,0x6240,
	  0x6600,0xa6c1,0xa781,0x6740,0xa501,0x65c0,0x6480,0xa441,
	  0x6c00,0xacc1,0xad81,0x6d40,0xaf01,0x6fc0,0x6e80,0xae41,
	  0xaa01,0x6ac0,0x6b80,0xab41,0x6900,0xa9c1,0xa881,0x6840,
	  0x7800,0xb8c1,0xb981,0x7940,0xbb01,0x7bc0,0x7a80,0xba41,
	  0xbe01,0x7ec0,0x7f80,0xbf41,0x7d00,0xbdc1,0xbc81,0x7c40,
	  0xb401,0x74c0,0x7580,0xb541,0x7700,0xb7c1,0xb681,0x7640,
	  0x7200,0xb2c1,0xb381,0x7340,0xb101,0x71c0,0x7080,0xb041,
	  0x5000,0x90c1,0x9181,0x5140,0x9301,0x53c0,0x5280,0x9241,
	  0x9601,0x56c0,0x5780,0x9741,0x5500,0x95c1,0x9481,0x5440,
	  0x9c01,0x5cc0,0x5d80,0x9d41,0x5f00,0x9fc1,0x9e81,0x5e40,
	  0x5a00,0x9ac1,0x9b81,0x5b40,0x9901,0x59c0,0x5880,0x9841,
	  0x8801,0x48c0,0x4980,0x8941,0x4b00,0x8bc1,0x8a81,0x4a40,
	  0x4e00,0x8ec1,0x8f81,0x4f40,0x8d01,0x4dc0,0x4c80,0x8c41,
	  0x4400,0x84c1,0x8581,0x4540,0x8701,0x47c0,0x4680,0x8641,
	  0x8201,0x42c0,0x4380,0x8341,0x4100,0x81c1,0x8081,0x4040};

/*CRC校验子函数
入口参数: Bytes_Num - 校验数据字节长度
				Data_In   - 数据首地址
出口参数: CRC_Check - 校验结果
*/

unsigned  short CUniMsg::CRC_Check(int Bytes_Num,char * Data_In)
{
	unsigned short i, index, crc=0;

	for(i=0; i<Bytes_Num; i++)
	{
		index = ((crc^*(Data_In+i))&0x00ff);
		crc = ((crc>>8)&0x00ff)^CRC_Tab[index];
	}
	return crc;
}

void CUniMsg::WritetMessageToBuffer(UniVar & uvBuffer,int flag)
{
	int iLen=sizeof(CUniMsg)+sizeof(long)+(m_iNumOfTV+1)/2;
	for(int i=0;i<m_iNumOfTV;i++){
		switch(m_pTV[i].it){
		case DATA_TYPE_INT:
		case DATA_TYPE_DWORD:
			iLen+=sizeof(long);
			break;
		case DATA_TYPE_FLOAT:
			if(flag){
				iLen+=sizeof(double);
			}
			else {
				iLen+=sizeof(float);
			}
			break;
		case DATA_TYPE_STRING:
			{
				if((strlen(m_pTV[i].uv.cv)+1)!=(UINT)(m_pTV[i].GetDataLength())){
					UniVar uuv=m_pTV[i].uv.cv;
					m_pTV[i]=uuv;
				}
				iLen+=m_pTV[i].GetDataLength();
			}
			break;
		case DATA_TYPE_HANDLE:
			iLen+=(sizeof(long)+m_pTV[i].GetDataLength());
			break;
		default:
			break;
		}
	}
	uvBuffer.SetValue((void *)NULL,iLen);
	BYTE * pVoid=(BYTE *)(LPSTR)uvBuffer;
	UniVar * pv=m_pTV;
	if(flag)
		m_pTV=(UniVar *)0x0000abce;
	else
		m_pTV=(UniVar *)0x0000abcd;
	BYTE * p1=pVoid;
	BYTE * p2=p1+(m_iNumOfTV+1)/2;
	memcpy(pVoid+iLen-sizeof(CUniMsg),this,sizeof(CUniMsg));
	m_pTV=pv;
	for(i=0;i<m_iNumOfTV;i++){
		if(i%2){
			p1[i/2]+=((m_pTV[i].it)<<4)&0xf0;
		}
		else{
			p1[i/2]+=m_pTV[i].it;
		}
		switch(m_pTV[i].it){
		case DATA_TYPE_INT:
		case DATA_TYPE_DWORD:
			*((long *)p2)=m_pTV[i].uv.iv;
			p2+=sizeof(long);
			break;
		case DATA_TYPE_FLOAT:
			if(flag){
				*((double *)p2)=m_pTV[i].uv.dv;
				p2+=sizeof(double);
			}
			else {
				*((float *)p2)=(float)m_pTV[i].uv.dv;
				p2+=sizeof(float);
			}
			break;
		case DATA_TYPE_STRING:
			memcpy(p2,m_pTV[i].uv.cv,m_pTV[i].GetDataLength());
			p2+=m_pTV[i].GetDataLength();
			break;
		case DATA_TYPE_HANDLE:
			*((long *)p2)=m_pTV[i].GetDataLength();
			p2+=sizeof(long);
			memcpy(p2,m_pTV[i].uv.cv,m_pTV[i].GetDataLength());
			p2+=m_pTV[i].GetDataLength();
			break;
		default:
			break;
		}
	}
	WORD * pwcrc=(WORD *)(p1+iLen-2);
	if(iLen>64*1024){
		*pwcrc=0;
	}
	else{
		*pwcrc=CRC_Check(iLen-2,(char *)p1);
	}
}

DWORD CUniMsg::GetReceiveModFromBuffer(UniVar & uvBuffer)
{
	int iLen=uvBuffer.GetDataLength();
	BYTE * pBuffer=(BYTE *)(LPSTR)uvBuffer;
	if(iLen<sizeof(CUniMsg)||!pBuffer)return 0xffffffff;
	WORD * pwcrc=(WORD *)(pBuffer+iLen-2);
	if(iLen>64*1024){
		if(*pwcrc!=0)return 0xffffffff;
	}
	else{
		WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
		if(*pwcrc!=wCheck)return 0xffffffff;
	}
	pwcrc=(WORD *)(pBuffer+iLen-4);
	if(*pwcrc!=0xabcd&&*pwcrc!=0xabce)return 0xffffffff;
	CUniMsg * pMsg=(CUniMsg *)(pBuffer+iLen-sizeof(CUniMsg));
	return pMsg->m_dwReceiveMode;
}

BOOL CUniMsg::ReadMessageFromBuffer(UniVar & uvBuffer)
{
	int iLen=uvBuffer.GetDataLength();
	BYTE * pBuffer=(BYTE *)(LPSTR)uvBuffer;
	if(iLen<sizeof(CUniMsg)||!pBuffer)return FALSE;
	WORD * pwcrc=(WORD *)(pBuffer+iLen-2);
	if(iLen>64*1024){
		if(*pwcrc!=0)return 0xffffffff;
	}
	else{
		WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
		if(*pwcrc!=wCheck)return 0xffffffff;
	}
//	WORD wCheck=CRC_Check(iLen-2,(char *)pBuffer);
//	if(*pwcrc!=wCheck)return FALSE;
	pwcrc=(WORD *)(pBuffer+iLen-4);
	if(*pwcrc!=0xabcd&&*pwcrc!=0xabce)return FALSE;
	int flag=(*pwcrc==0xabce);
	Clear();
	CUniMsg * pMsg=(CUniMsg *)(pBuffer+iLen-sizeof(CUniMsg));
	BYTE * p1=pBuffer;
	BYTE * p2=p1+(pMsg->m_iNumOfTV+1)/2;
	memcpy(this,pMsg,sizeof(CUniMsg));
	m_pTV=(UniVar *)UniVar::NewBlock(sizeof(UniVar)*(m_iNumOfTV+m_btEmptySlotNum));
	memset(m_pTV,0,sizeof(UniVar)*(m_iNumOfTV+m_btEmptySlotNum));
	for(int i=0;i<m_iNumOfTV;i++){
		if(i%2){
			m_pTV[i].it=(p1[i/2]>>4);
		}
		else{
			m_pTV[i].it=(p1[i/2]&0x0f);
		}
		switch(m_pTV[i].it){
		case DATA_TYPE_INT:
		case DATA_TYPE_DWORD:
			m_pTV[i].uv.iv=*((long *)p2);
			p2+=sizeof(long);
			break;
		case DATA_TYPE_FLOAT:
			if(flag){
				m_pTV[i].uv.dv=*((double *)p2);
				p2+=sizeof(double);
			}
			else {
				m_pTV[i].uv.dv=(double)(*((float *)p2));
				p2+=sizeof(float);
			}
			break;
		case DATA_TYPE_STRING:
			m_pTV[i]=(char *)p2;
			p2+=m_pTV[i].GetDataLength();
			break;
		case DATA_TYPE_HANDLE:
			m_pTV[i].SetValue((void *)(p2+sizeof(long)),*((long *)p2));
			p2+=*((long *)p2)+sizeof(long);
			break;
		default:
			break;
		}
	}
	return TRUE;
}

CAsynWorker::CAsynWorker(CDataBus * pBus)
{
	m_pThis=this;
	m_pBus=pBus;
	m_pCmdReceive=NULL;
	m_pCmdSend=NULL;
	m_btCurRoad=m_btPointRoad=m_btIsPointed=m_btNumberOfRoad=0;
};

CAsynWorker::~CAsynWorker(){
	if(m_btIsPointed==0xff){
		UnPointeRoad();
	}
	m_pThis=NULL;
	if(m_pCmdSend)delete m_pCmdSend;
	if(m_pCmdReceive)delete m_pCmdReceive;
};

void CAsynWorker::PointeRoad(int iNum,int iTimeOut,BOOL bAuto)
{
	if(m_pBus){
		m_btPointRoad=m_pBus->CreateRoad(this,iNum,iTimeOut);
		if(m_btPointRoad==0xff){
			m_btPointRoad=0;
		}
		else{
			if(!bAuto)
				m_btIsPointed=m_btPointRoad;
			else
				m_btIsPointed=0xff;
			m_btNumberOfRoad=iNum;
		}
	}
}

void CAsynWorker::UnPointeRoad()
{
	if(m_pBus&&m_btNumberOfRoad&&m_btIsPointed!=0xff){
		m_pBus->RemoveRoad(this,m_btPointRoad,m_btNumberOfRoad);
		m_btCurRoad=m_btPointRoad=m_btIsPointed=m_btNumberOfRoad=0;
	}
}

void CAsynWorker::SetBus(CDataBus * pBus)
{
	m_pBus=pBus;
	m_pCmdReceive=NULL;
	m_pCmdSend=NULL;
	ASSERT(m_pBus->IsValid(m_pBus));
};

DWORD CAsynWorker::SendMsg(CUniMsg * pMsg,int iroad,HANDLE hKey,int iTimerCount){
	if(!m_pBus->IsValid(m_pBus)){
		return 0;
	}
	try{
		pMsg->m_pSender=this;
		pMsg->m_dwSendMode=0;
		if(pMsg->m_btMsgType==MSG_COMMAND){
			if(m_pCmdSend){
				if(m_pCmdSend->m_btMsgType==MSG_COMMAND)
					return 0;//INVALID_IDENT;
				CUniMsg * pTempMsg=m_pCmdSend;
				m_pCmdSend=NULL;
				try{
					delete pTempMsg;
				}
				catch(...){}
			}
			m_pCmdSend=new CUniMsg(pMsg);
			if (!m_pCmdSend)
				TRACE("m_pCmdSend is NULL\n"); 
			if(iTimerCount>0){
				m_pCmdSend->m_btIsTimeLimited=1;
			}
			if(iroad==-1){
				return m_pBus->SendMessage(m_pCmdSend,hKey,iTimerCount);
			}
			else{
				return m_pBus->SendMessage(m_pCmdSend,iroad,hKey,iTimerCount);
			}
		}
		else if(pMsg->m_btMsgType==MSG_RESPONSE){
			if(m_pCmdReceive){
				if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
					if(m_pCmdReceive->m_dwCommand==pMsg->m_dwCommand){//unknown message
						pMsg->m_dwIdent=m_pCmdReceive->m_dwIdent;
						CUniMsg *pTempMsg=m_pCmdReceive;
						m_pCmdReceive=NULL;
						try{
							delete pTempMsg;
						}
						catch(...){}
						if(iroad==-1)
							return m_pBus->SendMessage(pMsg,pTempMsg->m_btBusRoad);
						else
							return m_pBus->SendMessage(pMsg,iroad);
					}
				}
			}
			if(iroad==-1){
				if(m_pCmdReceive)
					return m_pBus->SendMessage(pMsg,m_pCmdReceive->m_btBusRoad);
				else {
					if(pMsg->m_pReceivor->IsValid()&&pMsg->m_pReceivor->m_pCmdSend)
						return m_pBus->SendMessage(pMsg,pMsg->m_pReceivor->m_pCmdSend->m_btBusRoad);
					else 
						return m_pBus->SendMessage(pMsg);
				}
			}
			else
				return m_pBus->SendMessage(pMsg,iroad);
		}
		else {
			if(iroad==-1)
				return m_pBus->SendMessage(pMsg,hKey);
			else
				return m_pBus->SendMessage(pMsg,iroad,hKey);
		}
	}
	catch(...){
		LogEvent(exceptionLog,pMsg->m_dwCommand,0,"message send error","except.txt");
		return 0;
	}
}

BOOL CAsynWorker::SendMsg(DWORD & dwIdent,CUniMsg * pMsg,int iroad,HANDLE hKey,int iTimerCount){
	if(!m_pBus->IsValid(m_pBus)){
		return 0;//INVALID_IDENT;
	}
	try{
		pMsg->m_pSender=this;
		pMsg->m_dwSendMode=0;
		if(pMsg->m_btMsgType==MSG_COMMAND){
			if(m_pCmdSend){
				if(m_pCmdSend->m_btMsgType==MSG_COMMAND)
					return 0;//INVALID_IDENT;
				CUniMsg * pTempMsg=m_pCmdSend;
				m_pCmdSend=NULL;
				try{
					delete pTempMsg;
				}
				catch(...){}
			}
			m_pCmdSend=new CUniMsg(pMsg);
			if(iTimerCount>0){
				m_pCmdSend->m_btIsTimeLimited=1;
			}
			DWORD iret;
			if(iroad==-1)
				iret=m_pBus->SendMessage(dwIdent,m_pCmdSend,-1,hKey,iTimerCount);
			else
				iret=m_pBus->SendMessage(dwIdent,m_pCmdSend,iroad,hKey,iTimerCount);
			return iret;
		}
		else if(pMsg->m_btMsgType==MSG_RESPONSE){
			if(m_pCmdReceive){
				if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
					if(m_pCmdReceive->m_dwCommand==pMsg->m_dwCommand){//unknown message
						DWORD iret;
						pMsg->m_dwIdent=m_pCmdReceive->m_dwIdent;
						CUniMsg * pTempMsg=m_pCmdReceive;
						m_pCmdReceive=NULL;
						try{
							delete pTempMsg;
						}
						catch(...){}
						if(iroad==-1)
							iret=m_pBus->SendMessage(pMsg,pTempMsg->m_btBusRoad);
						else
							iret=m_pBus->SendMessage(pMsg,iroad);
						return iret;
					}
				}
			}
			if(iroad==-1){
				if(m_pCmdReceive)
					return m_pBus->SendMessage(pMsg,m_pCmdReceive->m_btBusRoad);
				else {
					if(pMsg->m_pReceivor->IsValid()&&pMsg->m_pReceivor->m_pCmdSend)
						return m_pBus->SendMessage(pMsg,pMsg->m_pReceivor->m_pCmdSend->m_btBusRoad);
					else 
						return m_pBus->SendMessage(pMsg);
				}
			}
			else
				return m_pBus->SendMessage(pMsg,iroad);
		}
		else {
			if(iroad==-1)
				return m_pBus->SendMessage(pMsg,hKey);
			else
				return m_pBus->SendMessage(pMsg,iroad,hKey);
		}
	}
	catch(...){
		LogEvent(exceptionLog,pMsg->m_dwCommand,0,"message send error1","except.txt");
		return 0;
	}
}

HANDLE CAsynWorker::LockWorker(DWORD dwId,CAsynWorker * pWorker)
{
	if(!m_pBus)return NULL;
	if(!pWorker)pWorker=this;
	return m_pBus->LockWorker(pWorker,this,dwId);
}

void CAsynWorker::ApplyWorkerLock(DWORD dwId,CAsynWorker * pWorker)
{
	if(!m_pBus)return ;
	if(!pWorker)pWorker=this;
	m_pBus->ApplyWorkerLock(pWorker,this,dwId);
}

void CAsynWorker::UnlockWorker(HANDLE hKey,CAsynWorker * pWorker,DWORD dwID)
{
	if(!m_pBus)return ;
	if(!pWorker)pWorker=this;
	m_pBus->UnlockWorker(pWorker,hKey,this,dwID);
}

#define RECEIVE_BUSY -1
#define RECEIVE_EXCEPTION -2

void CAsynWorker::OnMsgReceive(CUniMsg * pMsg){
	if(!m_pBus)return ;
	if(pMsg->m_btMsgType==MSG_COMMAND){
		if(m_pCmdReceive){
			if(m_pCmdReceive->m_btMsgType==MSG_COMMAND){
				CUniMsg um;
				um.SetMessage(0,pMsg->m_dwSendMode,this,pMsg->m_pSender,EVT_CMD_BUSYCMD,MSG_EVENT,UniVar(pMsg->m_dwCommand),
					InValidVar
					);
				um.m_ierror=RECEIVE_BUSY;
				um.m_dwIdent=pMsg->m_dwIdent;
				m_pBus->SendMessage(&um,pMsg->m_btBusRoad);
				return;//the old command not dealed
			}
			CUniMsg * pTempMsg=m_pCmdReceive;
			m_pCmdReceive=NULL;
			try{
				delete pTempMsg;
			}
			catch(...){}
		}
		m_pCmdReceive=new CUniMsg(pMsg);
		OnMsgCmd(pMsg);
	}
	else if(pMsg->m_btMsgType==MSG_RESPONSE){
		if(!m_pCmdSend)return ;//unknow message
		if(m_pCmdSend->m_btMsgType!=MSG_COMMAND)return;
		if(m_pCmdSend->m_dwIdent!=pMsg->m_dwIdent)return;//unknown message
		CUniMsg * pTempMsg=m_pCmdSend;
		m_pCmdSend=NULL;
		if(pTempMsg->m_btIsTimeLimited)
			m_pBus->CancelTime(this,pTempMsg->m_dwIdent,true);
		try{
			OnMsgResp(pMsg,pTempMsg);
		}
		catch(...){
		}
		delete pTempMsg;
	}
	else if(pMsg->m_btMsgType==MSG_EVENT){
		try{
			switch(pMsg->m_dwCommand){

⌨️ 快捷键说明

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