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

📄 awflow.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			CResDistrabutor * pDistr=(CResDistrabutor * )(int)pdwCommandList[1];
			if(pDistr->IsValid()){
				pdwCommandList[0]=1;
				pDistr->AddRes((DWORD)pdwCommandList[1],(LPCTSTR)pdwCommandList[2],(DWORD)pdwCommandList[3],(DWORD)pdwCommandList[4],(DWORD)pdwCommandList[5]);
			}
		}
		break;
	case APIBUSFreeRes					://0x00f2000f //int obj,int dwResKey
		{
			CResDistrabutor * pDistr=(CResDistrabutor * )(int)pdwCommandList[1];
			if(!pDistr->IsValid()){
				m_iErrorCode=-1;
				return SetContinue();
			}
			m_iErrorCode=0;
			CUniMsg um;
			um.SetMessage(NULL,pDistr,CMD_FREE_RES,MSG_COMMAND);
			um.Add(pdwCommandList[2]);
			COMMANDRESULT ret=SetPause(APIBUSFreeRes);
			SendMsg(m_dwFlowCommadnIDent,&um,3,NULL,-1);
			return ret;
		}
		break;
	case APIBUSLockRes					://0x00f20010 //int obj,int dwResKey
		{ 
			CResDistrabutor * pDistr=(CResDistrabutor * )(int)pdwCommandList[1];
			if(!pDistr->IsValid()){
				m_iErrorCode=-1;
				return SetContinue();
			}
			m_iErrorCode=0;
			CUniMsg um;
			um.SetMessage(NULL,pDistr,CMD_LOCK_RES,MSG_COMMAND);
			um.Add(pdwCommandList[2]);
			COMMANDRESULT ret=SetPause(APIBUSLockRes);
			SendMsg(m_dwFlowCommadnIDent,&um,3,NULL,-1);
			return ret;
		}
		break;
	case APIBUSApplyResbySkill			://0x00f20011 //int obj,int dwNeedKey1,int dwNeedKey2,int dwType,string szFeature,RGT int dwRight=0
		{
			CResDistrabutor * pDistr=(CResDistrabutor * )(int)pdwCommandList[1];
			if(!pDistr->IsValid()){
				m_iErrorCode=-1;
				return SetContinue();
			}
			int iMod=(int)pdwCommandList[6];
			m_iErrorCode=0;
			switch(iMod){
			case 0:
				{
					CUniMsg um;
					um.SetMessage(NULL,pDistr,CMD_APPLY_RES,MSG_COMMAND);
					um.Add(pdwCommandList[1]);
					um.Add(pdwCommandList[2]);
					um.Add(pdwCommandList[3]);
					um.Add(pdwCommandList[4]);
					um.Add(pdwCommandList[5]);
					COMMANDRESULT ret=SetPause(APIBUSApplyResbyGroup);
					SendMsg(m_dwFlowCommadnIDent,&um,3,NULL,-1);
					return ret;
				}
				break;
			case 1:
				{
					CUniMsg um;
					um.SetMessage(NULL,pDistr,CMD_APPLY_RES,MSG_COMMAND);
					um.Add(pdwCommandList[1]);
					um.Add(pdwCommandList[2]);
					um.Add(pdwCommandList[3]);
					um.Add(pdwCommandList[4]);
					um.Add(pdwCommandList[5]);
					SendMsg(&um,3,NULL,-1);
					return SetContinue();
				}
				break;
			case 2:
				{
					pdwCommandList[0]=(int)m_pBus->SynDistributorTask(pdwCommandList[0],pdwCommandList[4],(DWORD)pdwCommandList[3]);
					return SetContinue();
				}
				break;
			default:
				break;
			}
		}
		break;
	case APIBUSApplyResbyGroup			://0x00f20012 //int obj,int dwNeedKey1,int dwNeedKey2,int dwType,int igroupid,RGT int dwRight=0
		{
			CResDistrabutor * pDistr=(CResDistrabutor * )(int)pdwCommandList[1];
			if(!pDistr->IsValid()){
				m_iErrorCode=-1;
				return SetContinue();
			}
			int iMod=(int)pdwCommandList[6];
			m_iErrorCode=0;
			switch(iMod){
			case 0:
				{
					CUniMsg um;
					um.SetMessage(NULL,pDistr,CMD_APPLY_RES,MSG_COMMAND);
					um.Add(pdwCommandList[1]);
					um.Add(pdwCommandList[2]);
					um.Add(pdwCommandList[3]);
					um.Add(pdwCommandList[4]);
					um.Add(pdwCommandList[5]);
					COMMANDRESULT ret=SetPause(APIBUSApplyResbyGroup);
					SendMsg(m_dwFlowCommadnIDent,&um,3,NULL,-1);
					return ret;
				}
				break;
			case 1:
				{
					CUniMsg um;
					um.SetMessage(NULL,pDistr,CMD_APPLY_RES,MSG_COMMAND);
					um.Add(pdwCommandList[1]);
					um.Add(pdwCommandList[2]);
					um.Add(pdwCommandList[3]);
					um.Add(pdwCommandList[4]);
					um.Add(pdwCommandList[5]);
					SendMsg(&um,3,NULL,-1);
					return SetContinue();
				}
				break;
			case 2:
				{
					pdwCommandList[0]=(int)m_pBus->SynDistributorTask(pdwCommandList[0],pdwCommandList[4],(DWORD)pdwCommandList[3]);
					return SetContinue();
				}
				break;
			default:
				break;
			}
		}
		break;
	default:
		m_pCmdExcutor=NULL;
		GetExprObj(dwCommand,m_pCmdExcutor,m_dwExcuteModId);
		if(m_pCmdExcutor){
			m_dwCommandExcute=dwCommand;
			COMMANDRESULT ret;//=SetPause(dwCommand);
			if(m_dwExcuteModId==0||m_dwExcuteModId==GetModId()){
				if(m_pCmdExcutor->IsValid()){
					ret=m_pCmdExcutor->ExcuteDirect(dwCommand,(DWORD)(CAsynWorker *)this,0,iNum,pdwCommandList);
				}
				else{
					ret=LINE_CONTINUE;
				}
				if(ret==LINE_CONTINUE){
					SetContinue();
				}
				else{
					SetPause(dwCommand);
				}
				return ret;
			}
			else{
				m_iFlowTimeOutSec=5*300;
				CUniMsg um;
				um.SetMessage(GetModId(),m_dwExcuteModId,this,m_pCmdExcutor,EVT_EXCUTE_REMOTE,MSG_EVENT,UniVar(dwCommand),InValidVar);
				for(int j=0;j<iNum;j++){
					um.Add(pdwCommandList[j]);
				}
				m_pBus->SendMessage(&um);
				ret=SetPause(dwCommand);
			}
			return ret;
		}
		else{
			SetContinue();
			return CBaseFlow::DefaultParse(dwCommand,pdwCommandList,iNum);
		}
	}
	return SetContinue();
}

BOOL CAWFlow::GetVarValue(DWORD dwVarID,UniVar & tv)
{
	switch(dwVarID){
	case 0x00f10002:
		tv=(int)SetDataCallBack;
		return TRUE;
	case 0x00f10001:
		tv=(DWORD)((CAsynWorker * )this);
		return TRUE;
	case 0x00f10003:
		if(m_pBus){
			tv=m_pBus->m_unMod.dwModId;
		}
		return TRUE;
	case 0x00f10004:
		if(m_pBus){
			tv=m_pBus->m_dwPudFlag;
		}
		return TRUE;
	case 0x00f10005:
		if(m_pBus){
			tv=m_pBus->m_csName;
		}
		return TRUE;
	default:
		return CBaseFlow::GetVarValue(dwVarID,tv);
	}
}

BOOL CAWFlow::SetVarValue(DWORD dwVarID,UniVar tv)
{
	switch(dwVarID){
	case 0x00f10003:
		if(m_pBus){
			m_pBus->m_unMod.dwModId=(DWORD)tv;
		}
		return TRUE;
	case 0x00f10004:
		if(m_pBus){
			m_pBus->m_dwPudFlag=(DWORD)tv;
		}
		return TRUE;
	case 0x00f10005:
		if(m_pBus){
			m_pBus->m_csName=(char *)tv;
			if(!m_pBus->m_csName.IsEmpty())
				m_pBus->AddStationName(m_pBus->m_unMod.dwModId,(LPSTR)(LPCTSTR)m_pBus->m_csName);
		}
		return TRUE;
	default:
		return CBaseFlow::SetVarValue(dwVarID,tv);
	}
}

void CAWFlow::AddCommand(CUniMsg * pMsg,BOOL bRunDirect)
{
	BOOL bRun=FALSE;
	WaitForSingleObject(m_hMutex,1000);
	try{
		if(m_bNeedCommand){
			if(m_pCurMsg)delete m_pCurMsg;
			pMsg->m_iTimeStamp=GetTimeStamp();
			m_pCurMsg=pMsg;
			m_bNeedCommand=FALSE;
			if(!bRunDirect){
				FunctionRet(FALSE,
					APIBUSGetCommand,
					UniVar(m_pCurMsg->m_dwCommand),
					UniVar((DWORD)m_pCurMsg->m_pSender),
					UniVar((DWORD)m_pCurMsg->m_pReceivor),
					InValidVar);
			}
			else{
				bRun=TRUE;
			}
		}
		else {
			m_CommandList.Add(pMsg);
		}
	}
	catch(...){
		LogEvent(exceptionLog,0,0,"Add command error","except.txt");
	}
	ReleaseMutex(m_hMutex);
	if(bRun){
		FunctionRet(TRUE,
			APIBUSGetCommand,
			UniVar(m_pCurMsg->m_dwCommand),
			UniVar((DWORD)m_pCurMsg->m_pSender),
			UniVar((DWORD)m_pCurMsg->m_pReceivor),
			InValidVar);
	}
}

COMMANDRESULT CAWFlow::GetCommand(UniVar * pVar,int Allways)
{
	COMMANDRESULT ret=LINE_PAUSE;
	WaitForSingleObject(m_hMutex,1000);
	try{
		if(m_pCurMsg)delete m_pCurMsg;
		m_pCurMsg=NULL;
		if(m_CommandList.GetSize()){
			m_pCurMsg=m_CommandList.GetAt(0);
			m_CommandList.RemoveAt(0);
			pVar[0]=UniVar((DWORD)m_pCurMsg->m_dwCommand);
			pVar[1]=UniVar((DWORD)m_pCurMsg->m_pSender);
			pVar[2]=UniVar((DWORD)m_pCurMsg->m_pReceivor);
			ret=SetContinue();
			m_bNeedCommand=FALSE;
		}
		else {
			if(Allways){
				pVar[0]=-1;
				pVar[1]=-1;
				pVar[2]=-1;
				ret=SetContinue();
				m_bNeedCommand=FALSE;
			}
			else m_bNeedCommand=TRUE;
		}
	}
	catch(...){
		LogEvent(exceptionLog,0,0,"Get command error","except.txt");
	}
	ReleaseMutex(m_hMutex);
	if(ret==LINE_PAUSE)return SetPause(APIBUSGetCommand);
	else return ret;
}

int CAWFlow::FunctionRet(BOOL bRunDirect,DWORD dwPauseCommand,UniVar * pVar,int Num)
{
	if(m_dwPauseCommand==0xffffffff)return 0;
	if(dwPauseCommand!=m_dwPauseCommand){
		if(dwPauseCommand!=APIBUSSetTimeOut)
			return 0;
		else {
			m_dwPauseCommand=0xffffffff;
			m_iErrorCode=-23001;//command TIMEOUT
			if(!bRunDirect)
				return Resume();
			else{
				SafeRun();
				return 1;
			}
		}
	}
	else {
		m_dwPauseCommand=0xffffffff;
		if(m_iFlowTimeOutSec>0){
			m_iFlowTimeOutSec=0;
			CancelTime(FlowCmdTimerSet);
		}
		for(int i=0;i<Num;i++){
			RestoreCurrentParam(pVar[i],i);
		}
		if(!bRunDirect)
			return Resume();
		else{
			SafeRun();
			return 1;
		}
	}
};

int CAWFlow::FunctionRet(BOOL bRunDirect,DWORD dwPauseCommand,UniVar uvi,...)
{
	if(m_dwPauseCommand==0xffffffff)
		return 0;
	if(dwPauseCommand!=m_dwPauseCommand){
		if(dwPauseCommand!=APIBUSSetTimeOut)
			return 0;
		else {
			m_dwPauseCommand=0xffffffff;
			m_iErrorCode=-23001;//command TIMEOUT
			if(!bRunDirect)
				return Resume();
			else{
				SafeRun();
				return 1;
			}
		}
	}
	else {
		m_dwPauseCommand=0xffffffff;
		if(m_iFlowTimeOutSec>0){
			m_iFlowTimeOutSec=0;
			CancelTime(FlowCmdTimerSet);
		}
		if(!UniVar::ValidVar(&uvi)){
			if(!bRunDirect)
				return Resume();
			else{
				SafeRun();
				return 1;
			}
		}
		RestoreCurrentParam(uvi,0);
		va_list varl;
		va_start(varl,uvi);
		UniVar uv;
		int i=1;
		while(1){
			uv=va_arg(varl,UniVar);
			if(UniVar::ValidVar(&uv)){
				RestoreCurrentParam(uv,i);
				i++;
			}
			else break;
		};
		va_end(varl);
		if(!bRunDirect)
			return Resume();
		else{
			SafeRun();
			return 1;
		}
	}
}

void CAWFlow::AddCommand(BOOL bRunDirect,DWORD dwCommand,DWORD dwObject,DWORD dwType,DWORD sendMode,DWORD dwIdent,int Num,UniVar * pTV)
{
	CUniMsg * pUm=new CUniMsg;
	for(int i=0;i<Num;i++)
		pUm->Add(pTV[i]);
	pUm->m_dwIdent=dwIdent;
	*((DWORD *)&pUm->m_pReceivor)=dwType;
	pUm->m_dwCommand=dwCommand;
	*((DWORD *)&pUm->m_pSender)=dwObject;
	pUm->m_dwSendMode=sendMode;
	AddCommand(pUm,bRunDirect);
}

void CAWFlow::AddCommand(BOOL bRunDirect,DWORD dwCommand,DWORD dwObject,DWORD dwType,DWORD dwIdent,DWORD sendMode,UniVar uvi,...)
{
	CUniMsg * pUm=new CUniMsg;
	pUm->m_dwIdent=dwIdent;
	if(UniVar::ValidVar(&uvi)){
		pUm->Add(uvi);
		va_list varl;
		va_start(varl,uvi);
		UniVar uv;
		while(1){
			uv=va_arg(varl,UniVar);
			if(UniVar::ValidVar(&uv)){
				pUm->Add(uv);
			}
			else break;
		};
		va_end(varl);
	}
	pUm->m_dwSendMode=sendMode;
	*((DWORD *)&pUm->m_pReceivor)=dwType;
	pUm->m_dwCommand=dwCommand;
	*((DWORD *)&pUm->m_pSender)=dwObject;
	AddCommand(pUm,bRunDirect);

⌨️ 快捷键说明

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