#include "StdAfx.h" #include "WorkCmdInvoker.h" #include "GlobalFunction.h" #include "MsgBox.h" #include "FileMgr.h" #include "WorkCmdFactory.h" #include "WorkCmdContainer.h" #include "ExceptionMsg.h" #include "DeviceState.h" #include "PciCh365Mgr.h" #include "PciPortMgr.h" #include "ProgressMgr.h" #include "DlgProgress.h" #include "CommonFlowMgr.h" CWorkCmdInvoker::CWorkCmdInvoker(void) { } CWorkCmdInvoker::~CWorkCmdInvoker(void) { } #if 1 //获取FileName 的完整路径 CString CWorkCmdInvoker::GetFullFilePath(const CString &FileName) { CString FilePath = _T("\\Parameter\\WorkFlow\\")+FileName+_T(".flw"); CString FullFilePath; CFileMgr FileMgr; FileMgr.GetFullFilePath(FullFilePath,FilePath); return FullFilePath; } //创建指令到WorkCmdVec void CWorkCmdInvoker::CreatCmd(const CString &FilePath) { //提取指令文件到CmdVec ------------------------------------- vector CmdVec; CFileMgr FileMgr; FileMgr.ReadFileToStringVec(FilePath,CmdVec); CreatCmd(CmdVec); } void CWorkCmdInvoker::CreatCmd(vector &CmdVec) { CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance(); CmdContainer.Clear(); //根据读取的文本创建指令------------------------------ CWorkCmdFactory CmdFactory; vector::iterator iter = CmdVec.begin(); vector::iterator iter_end = CmdVec.end(); for(;iter!=iter_end;iter++) { try { CmdFactory.Creat(*iter); } catch(CExceptionMsg &Msg) { CMsgBox MsgBox; MsgBox.Show(Msg.GetMsgStr(), true); break; } } } #endif #if 1 //直接执行所有指令 void CWorkCmdInvoker::Excute() { CDeviceState &DeviceState = CDeviceState::GetInstance(); if(!DeviceState.CheckState(_STATE_WORKING,false))//不能是工作状态 return; DeviceState.SetState(_STATE_WORKING); //执行指令集 ExcuteAllCmd(); } //执行一条程序内部的指令 void CWorkCmdInvoker::ExcuteOneCmd(CWorkCmd *pCmd) { CDeviceState &DeviceState = CDeviceState::GetInstance(); if(!DeviceState.CheckState(_STATE_WORKING,false))//不能是工作状态 { return; } DeviceState.SetState(_STATE_WORKING); //添加到指令集 CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance(); CmdContainer.Clear(); CmdContainer.AddCmd(pCmd); //执行指令集 ExcuteAllCmd(); } void CWorkCmdInvoker::Excute(CWorkCmdContainer &CmdContainer) { vector> &WorkCmdVec = CmdContainer.GetContainer(); vector>::iterator iter = WorkCmdVec.begin(); vector>::iterator iter_end = WorkCmdVec.end(); for(;iter!=iter_end;iter++) { (*iter)->Work(false); } } //执行一个指令集 void CWorkCmdInvoker::ExcuteCmd(vector &CmdVec) { if(CmdVec.empty()) return; CDeviceState &DeviceState = CDeviceState::GetInstance(); if(!DeviceState.CheckState(_STATE_WORKING,false))//不能是工作状态 return; DeviceState.SetState(_STATE_WORKING); try//创建指令 { CreatCmd(CmdVec); } catch(CExceptionMsg &Msg) { CMsgBox MsgBox; MsgBox.Show(Msg.GetMsgStr(), true); DeviceState.SetState(_STATE_WAIT); return;//结束 } ExcuteAllCmd(); } //指令线程执行函数 UINT ExcuteAllCmdThread(LPVOID pParam) { CWorkCmdInvoker *p = (CWorkCmdInvoker *)pParam; p->ExcuteAllCmdExt(); return 0; } //执行指令集中所有的指令------------------------------------------------- void CWorkCmdInvoker::ExcuteAllCmd(bool bNewThread) { if(bNewThread)//在新的线程中执行 { CDlgProgress dlg; CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance(); int CmdCnt = CmdContainer.GetCmdCnt(); if(CmdCnt>1)//只有一条指令时不要显示进度 { //绑定进度条 #ifdef __PROGRESS_DLG__ gProgressMgr.SetWorkProgress(&dlg.GetProgress()); #endif } CWinThread* pThread = AfxBeginThread(ExcuteAllCmdThread,this, THREAD_PRIORITY_HIGHEST); if(CmdCnt>1)//只有一条指令时不要显示进度 { #ifdef __PROGRESS_DLG__ dlg.DoModal();//显示进度条对话框 #endif } WaitForThreadExit(pThread);//等待线程结束 #ifdef __PROGRESS_DLG__ gProgressMgr.SetWorkProgress(NULL); #endif } else { ExcuteAllCmdExt(); } } void CWorkCmdInvoker::ExcuteAllCmdExt() { CDeviceState &DeviceState = CDeviceState::GetInstance(); gLogMgr->WriteDebugLog(_T("func : ExcuteAllCmd ---------->Start")); CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance(); vector> &WorkCmdVec = CmdContainer.GetContainer(); m_bCancel = false;//指令是否终止 int size = WorkCmdVec.size();//用来计算进度 vector>::iterator iter = WorkCmdVec.begin(); vector>::iterator iter_end = WorkCmdVec.end(); CString ErrMsg; for(double k = 1;iter!=iter_end;iter++,k += 1) { //if((IsShiftKeyDown() || DeviceState.IsWorking()==false)&&m_bCancel==false) if((IsShiftKeyDown())&&m_bCancel==false) { CMsgBox MsgBox; if(MsgBox.ConfirmOkCancel(_T("停止执行?"))) { gLogMgr->WriteDebugLog(_T("func : ExcuteAllCmd---->停止执行")); m_bCancel = true; gCommonFlowMgr->SetbWorkStop(true); } else { DeviceState.SetState(_STATE_WORKING);//恢复工作状态 } } try { (*iter)->Work(m_bCancel);//如果有指令执行失败,强行终止 //进度 #ifdef __PROGRESS_DLG__ gProgressMgr.SetCurProgress(static_cast(k),size); #endif //设置时间 GetFrame()->m_DlgCutDeviceCtrl.Update(); } catch(CExceptionMsg &Msg) { ErrMsg = Msg.GetMsgStr(); CString str("Func : ExcuteAllCmd---->"); str += ErrMsg; gLogMgr->WriteDebugLog(str,_LOG_ERROR); m_bCancel = true; gCommonFlowMgr->SetbWorkStop(true); //强制结束进度条 #ifdef __PROGRESS_DLG__ gProgressMgr.SetCurProgress(100,100); #endif } } DeviceState.SetState(_STATE_WAIT); if(ErrMsg != "") { CMsgBox MsgBox; MsgBox.Show(ErrMsg); } gLogMgr->WriteDebugLog(_T("func : ExcuteAllCmd ---------->End")); } #endif