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

📄 userctrl.cpp

📁 一个多线程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include "stdafx.h"
#include "userctrl.h"
#include "global.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#define MYASSERT(f) if(!(f))throw 0x7ffffffe
//////////////////////////////////////////////////////////////////////
// CUserControl Class
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CUserControl::CUserControl()
{
	m_pThis=this;
	m_pFlow=NULL;
	m_pControl=NULL;
	m_csFlowName="";
	m_bBoolCanTrace=FALSE;
}

CUserControl::~CUserControl()
{
	m_pThis=NULL;
	if(m_bBoolCanTrace){
		if(gDllGlobalManager.m_pGlobalApi){
			gDllGlobalManager.m_pGlobalApi->CancelTraceFlow(this);
		}
	}
	CFlowControl * pc=m_pControl;
	if(m_pControl){
		m_pControl=NULL;
		delete pc;
	}
}

BOOL CUserControl::CreateFlow(LPSTR lpFlowFile,DWORD dwId)
{
	if(!m_pBus)return FALSE;
	if(m_btIsPointed==0||m_pBus->m_pRoad[m_btPointRoad]->IsValid())
		PointeRoad((BYTE)m_pBus->m_iFlowRoad);
	m_csFlowName=lpFlowFile; 
	if(m_pControl)delete m_pControl;
	m_pControl=new CFlowControl(lpFlowFile,this,this,dwId);
	if(!m_pFlow){
		if(m_pControl)
			delete m_pControl;
		m_pControl=NULL;
	}
	if(m_pControl){
		if(m_bBoolCanTrace){
			if(gDllGlobalManager.m_pGlobalApi){
				gDllGlobalManager.m_pGlobalApi->CanTraceFlow(this);
			}
		}
		return TRUE;
	}
	return FALSE;
}

BOOL CUserControl::CreateFlow(DWORD dwFlowId)
{
	if(!m_pBus)return FALSE;
	if(m_btIsPointed==0||m_pBus->m_pRoad[m_btPointRoad]->IsValid())
		PointeRoad((BYTE)m_pBus->m_iFlowRoad);
	m_csFlowName.Format("%ld",dwFlowId); 
	if(m_pControl)delete m_pControl;
	m_pControl=new CFlowControl(NULL,this,this,dwFlowId);
	if(!m_pFlow){
		if(m_pControl)
			delete m_pControl;
		m_pControl=NULL;
	}
	if(m_pControl){
		if(m_bBoolCanTrace){
			if(gDllGlobalManager.m_pGlobalApi){
				gDllGlobalManager.m_pGlobalApi->CanTraceFlow(this);
			}
		}
		return TRUE;
	}
	return FALSE;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CFlowControl::CFlowControl(LPSTR lpFlowFile,CUserControl * pUserControl,CFunctionRegister * pRegister,DWORD dwId)
{
	m_pUserFlow=CUserFlow::GetFlow(pRegister,lpFlowFile,dwId);
	ASSERT(pUserControl);
	m_pUserControl=pUserControl;
	m_pUserControl->SetControl(m_pUserFlow);
	if(m_pUserFlow){
		m_GlobalValue.SetSize(m_pUserFlow->dwGlobalVarNum);
		if(m_pUserFlow->dwGlobalVarNum)
			memset(&m_GlobalValue[0],0,sizeof(UniVar)*m_pUserFlow->dwGlobalVarNum);
	}
	m_pPerBNode=NULL;
	m_CallSt.iCurrent=-1;
	m_CallSt.isProcessStatus=-1;
	m_CallSt.pdwCrerentLine=NULL;
	m_CallSt.m_pPrivateVarrent=NULL;
	pdwCrerentLine=NULL;
	m_CallSt.iParamStart=0;
	m_CallSt.pt.pOt=NULL;
	m_ParamList.SetSize(100);
	memset(&m_ParamList[0],0,sizeof(UniVar)*100);
	m_iRound=0;
	m_bStop=FALSE;
	m_bStart=0;
	m_RunData.SetSize(50);iPop=-1;
	m_Status=FLOW_IDLE;
	m_bDebug=FALSE;
	m_bFunctionBreak=false;
}

CFlowControl::~CFlowControl()
{
	CUserControl * pc=m_pUserControl;
	if(m_Status!=FLOW_IDLE){
		m_bStop=TRUE;
		if(m_pUserControl)
			m_pUserControl->EndTask(200);
	}
	if(pc==m_pUserControl){
		for(int i=0;i<m_GlobalValue.GetSize();i++)
			m_GlobalValue[i]=0;
		if(m_pUserControl)
			m_pUserControl->ClearFlow();
		while(1){
			if(m_CallSt.m_pPrivateVarrent){
				for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
					if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
						m_CallSt.m_pPrivateVarrent[j]=0;
					}
				}
				UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
			}
			if(!m_pCallStack.Pop(m_CallSt))break;
		}
		m_CallSt.m_pPrivateVarrent=NULL;
		m_Status=FLOW_IDLE;	
	}
}

BOOL CFlowControl::GetDataValue(DWORD dwID,UniVar & tv)
{	
	switch(dwID&ITYPE_FILTER){
	case TYPE_CONST:	return m_pUserFlow->GetConst(dwID,tv);
	case TYPE_VARIANT:	return m_pUserControl->GetVarValue(dwID&POSID_FILTER,tv);
	case TYPE_STATIC:	return gpStyleMg.GetStaVar(dwID,tv);
	case TYPE_GLOBALVAR:	tv=m_GlobalValue[dwID&POSID_FILTER];return TRUE;
	case TYPE_LOCALVAR:		tv=m_CallSt.m_pPrivateVarrent[dwID&POSID_FILTER];return TRUE;
	}
	return FALSE;
}

BOOL CFlowControl::WaitForEnd(DWORD dwTime)
{
	DWORD dwStart=0;
	while(m_bStart==1&&dwStart<dwTime){
		if(dwTime!=0xffffffff)
			dwStart+=20;
		Sleep(20);
	}
	return (m_bStart!=1);
}

BOOL CFlowControl::SetDataValue(DWORD dwID,UniVar & tv)
{	
	switch(dwID&ITYPE_FILTER){
	case TYPE_VARIANT: return m_pUserControl->SetVarValue(dwID&POSID_FILTER,tv);
	case TYPE_STATIC: return gpStyleMg.SetStaVar(dwID,tv);
	case TYPE_GLOBALVAR: m_GlobalValue[dwID&POSID_FILTER]=tv;return TRUE;
	case TYPE_LOCALVAR: m_CallSt.m_pPrivateVarrent[dwID&POSID_FILTER]=tv;return TRUE;
	}
	return FALSE;
}

COMMANDRESULT CFlowControl::DefaultParse(DWORD dwCommand,UniVar * pdwCommandList,int iVarNum)
{
	try {
		return m_pUserControl->DefaultParse(dwCommand&POSID_FILTER,pdwCommandList,iVarNum);
	}
	catch(...){
		//log
		TRACE("flow exception cmd:%lx,param :%ld,%s\n",dwCommand,iVarNum,(LPSTR)(LPCTSTR)this->m_pUserFlow->m_csFileName);
		if(pdwCrerentLine)
			if(gDllGlobalManager.m_pGlobalApi)
				gDllGlobalManager.m_pGlobalApi->GLogEvent(exceptionLog,pdwCrerentLine[0],0,(LPSTR)(LPCTSTR)this->m_pUserFlow->m_csFileName ,"except.txt");
		return LINE_CONTINUE;
	}
}

COMMANDRESULT CFlowControl::RunLine(DWORD * pLine)
{
	if(!m_pUserFlow)return LINE_END;
	if(!m_pUserControl)
		return LINE_END;
	pun.pVoid=m_pUserFlow->GetStructFromId(pLine[0]);
	if(!pun.pVoid)
		return LINE_END;
	m_CallSt.pun=pun;
	switch(pLine[0]&ITYPE_FILTER){
	case TYPE_BNODE:
		{
			if(m_pPerBNode!=pun.pbn){
				if(m_pPerBNode)
					m_pPerBNode->dwOutTimes++;
				m_ListBNRoute.Add(pun.pbn);
				if(m_ListBNRoute.GetSize()>3000){
					m_ListBNRoute.RemoveAt(0);
				}
				m_pPerBNode=pun.pbn;
				pun.pbn->dwInTimes++;
			}
		}
		return LINE_CONTINUE;
	case TYPE_COMMAND:
		{
			COMMANDRESULT mst;
			if(pun.pcmd->ParamNum<1){
				m_CallSt.cNumOfParam=0;
				if(pun.pcmd->pFn){
					return pun.pcmd->pFn(NULL,0);
				}
				else {
					return DefaultParse(pun.pcmd->dwCommandId,NULL,0);
				}
			}
			else {
				m_CallSt.cNumOfParam=pun.pcmd->ParamNum;
				bool bAllSet=true;
				PARAMEMTER * pAram=&m_pUserFlow->m_pStyle->m_ParamArray[pun.pcmd->iStartParam+m_CallSt.cNumOfParam-1];
				if(pAram->lpstrPreFix&&!strcmp(pAram->lpstrPreFix,"...")){
					bAllSet=false;
					m_CallSt.cNumOfParam=0;
					while(pLine[m_CallSt.cNumOfParam+1]!=WORD_ENDOFLINE)m_CallSt.cNumOfParam++;
				}
				int ii=m_CallSt.cNumOfParam+m_CallSt.iParamStart;
				if(ii>m_ParamList.GetSize())m_ParamList.SetSize(ii);
				MYASSERT(m_CallSt.iParamStart>=0);
				UniVar tv;
				for(ii=0;ii<m_CallSt.cNumOfParam;ii++){
					if(ii<pun.pcmd->ParamNum-1){
						tv=Calculate(pLine[ii+1]);
						m_ParamList[ii+m_CallSt.iParamStart].SetData(&m_pUserFlow->m_pStyle->m_ParamArray[pun.pcmd->iStartParam+ii],tv);
					}
					else {
						if(bAllSet){
							tv=Calculate(pLine[ii+1]);
							m_ParamList[ii+m_CallSt.iParamStart].SetData(&m_pUserFlow->m_pStyle->m_ParamArray[pun.pcmd->iStartParam+ii],tv);
						}
						else{
							m_ParamList[ii+m_CallSt.iParamStart]=Calculate(pLine[ii+1]);
						}
					}
				}
				if(pun.pcmd->pFn){
					mst=pun.pcmd->pFn(&m_ParamList[m_CallSt.iParamStart],m_CallSt.cNumOfParam);
				}
				else {
					mst=DefaultParse(pun.pcmd->dwCommandId,&m_ParamList[m_CallSt.iParamStart],m_CallSt.cNumOfParam);
				}
				if(mst==LINE_PAUSE)
					return LINE_PAUSE;
				else if(mst==LINE_END)
					return LINE_END;
				PARAMEMTER * pAm=&m_pUserFlow->m_pStyle->m_ParamArray[pun.pcmd->iStartParam];
				for(ii=0;ii<m_CallSt.cNumOfParam;ii++){
					if(ii<pun.pcmd->ParamNum){
						if(pAm[ii].tv.inout==USE_TYPE_INOUT){
							SetDataValue(pLine[ii+1],m_ParamList[ii+m_CallSt.iParamStart]);
						}
					}
					else {
						SetDataValue(pLine[ii+1],m_ParamList[ii+m_CallSt.iParamStart]);
					}
					m_ParamList[ii+m_CallSt.iParamStart]=0;
				}
				return mst;
			}
		}
		break;
	case TYPE_FUNCTION:
		{
			UniVar * pVar=NULL,tv;
			if(pun.pfun->dwVarNum){
				pVar=(UniVar *)UniVar::NewBlock(sizeof(UniVar)*pun.pfun->dwVarNum);
				memset(pVar,0,sizeof(UniVar)*pun.pfun->dwVarNum);
				for(int ii=0;ii<pun.pfun->ParamNum;ii++){
					if(ii<pun.pfun->ParamNum){
						tv=Calculate(pLine[ii+1]);
						pVar[ii].SetData(&m_pUserFlow->m_ParamArray[pun.pfun->iStartParam+ii],tv);
					}
					else break;
				}
			}
			m_CallSt.pdwCrerentLine=pLine+1;
			m_pCallStack.Push(m_CallSt);
			m_CallSt.pt.pFun=pun.pfun;
			m_CallSt.iType=CALL_FUNC;
			m_CallSt.pdwCrerentLine=pLine+1;
			m_CallSt.iCurrent=pun.pfun->iStart;
			m_CallSt.m_pPrivateVarrent=pVar;
			return LINE_JUMP;
		}
		break;
	case TYPE_SYSTEM:
		switch(pLine[0]){
		case WORD_RESET:
			{
				if(m_ListBNRoute.GetSize()>=1){
					while(1){
						if(m_CallSt.iType==CALL_EVENT){
							UniVar up1=m_CallSt.m_pPrivateVarrent[0];
							UniVar up2=m_CallSt.m_pPrivateVarrent[1];
							DWORD dwId=m_CallSt.pt.pEv->pstkEvent->dwUserEventId;
							if(m_CallSt.m_pPrivateVarrent){
								for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
									if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
										m_CallSt.m_pPrivateVarrent[j]=0;
									}
								}
								UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
							}
							m_pCallStack.Pop(m_CallSt);
							EventCallOver(-1,dwId,up1,up2);
						}
						else if(m_CallSt.iType==CALL_MAIN)break;
						else {
							if(m_CallSt.m_pPrivateVarrent){
								for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
									if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
										m_CallSt.m_pPrivateVarrent[j]=0;
									}
								}
								UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
							}
							m_pCallStack.Pop(m_CallSt);
						}
					}
					m_CallSt.iCurrent=m_ListBNRoute[m_ListBNRoute.GetSize()-1]->dwLabel;
					return LINE_JUMP;
				}
				else {
					return LINE_CONTINUE;
				}
			}
		case WORD_BACK:
			{
				if(m_ListBNRoute.GetSize()>=2){
					m_pPerBNode=m_ListBNRoute[m_ListBNRoute.GetSize()-1];
					m_ListBNRoute.RemoveAt(m_ListBNRoute.GetSize()-1);
					while(1){
						if(m_CallSt.iType==CALL_EVENT){
							UniVar up1=m_CallSt.m_pPrivateVarrent[0];
							UniVar up2=m_CallSt.m_pPrivateVarrent[1];
							DWORD dwId=m_CallSt.pt.pEv->pstkEvent->dwUserEventId;
							if(m_CallSt.m_pPrivateVarrent){
								for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
									if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
										m_CallSt.m_pPrivateVarrent[j]=0;
									}
								}
								UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
							}
							m_pCallStack.Pop(m_CallSt);
							EventCallOver(-1,dwId,up1,up2);
						}
						else if(m_CallSt.iType==CALL_MAIN)break;
						else {
							if(m_CallSt.m_pPrivateVarrent){
								for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
									if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
										m_CallSt.m_pPrivateVarrent[j]=0;
									}
								}
								UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
							}
							m_pCallStack.Pop(m_CallSt);
						}
					}
					m_CallSt.iCurrent=m_ListBNRoute[m_ListBNRoute.GetSize()-1]->dwLabel;
					return LINE_JUMP;
				}
				else if(m_ListBNRoute.GetSize()==1){
					m_pPerBNode=m_ListBNRoute[m_ListBNRoute.GetSize()-1];
					return LINE_CONTINUE;
				}
				else{
					m_pPerBNode=NULL;
					return LINE_CONTINUE;
				}
				m_CallSt.iCurrent=pun.pbn->dwLabel;
				return LINE_JUMP;
			}
			break;
		case WORD_JUMP:
			{
				pun.pVoid=m_pUserFlow->GetStructFromId(pLine[1]);
				if(!pun.pVoid)return LINE_END;
				if(pLine[1]&ITYPE_FILTER!=TYPE_BNODE){
					UniVar tv=Calculate(pLine[1]);
					if(!tv.IsString()||tv.IsEmpty())return LINE_CONTINUE;
					pun.pbn=m_pUserFlow->GetBusinessNode((LPSTR)tv);
					if(!pun.pVoid)return LINE_CONTINUE;
				}
				while(1){
					if(m_CallSt.iType==CALL_EVENT){
						UniVar up1=m_CallSt.m_pPrivateVarrent[0];
						UniVar up2=m_CallSt.m_pPrivateVarrent[1];
						DWORD dwId=m_CallSt.pt.pEv->pstkEvent->dwUserEventId;
						if(m_CallSt.m_pPrivateVarrent){
							for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
								if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
									m_CallSt.m_pPrivateVarrent[j]=0;
								}
							}
							UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
						}
						m_pCallStack.Pop(m_CallSt);
						EventCallOver(-1,dwId,up1,up2);
					}
					else if(m_CallSt.iType==CALL_MAIN)break;
					else {
						if(m_CallSt.m_pPrivateVarrent){
							for(int j=0;j<(int)m_CallSt.pt.pFun->dwVarNum;j++){
								if(m_CallSt.m_pPrivateVarrent[j].GetDataLength()){
									m_CallSt.m_pPrivateVarrent[j]=0;
								}
							}
							UniVar::DeleteBlock(m_CallSt.m_pPrivateVarrent);
						}
						m_pCallStack.Pop(m_CallSt);
					}
				}
				m_CallSt.iCurrent=pun.pbn->dwLabel;
				return LINE_JUMP;

⌨️ 快捷键说明

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