You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
6.8 KiB
C++

#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<CString> CmdVec;
CFileMgr FileMgr;
FileMgr.ReadFileToStringVec(FilePath,CmdVec);
CreatCmd(CmdVec);
}
void CWorkCmdInvoker::CreatCmd(vector<CString> &CmdVec)
{
CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance();
CmdContainer.Clear();
//根据读取的文本创建指令------------------------------
CWorkCmdFactory CmdFactory;
vector<CString>::iterator iter = CmdVec.begin();
vector<CString>::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<Sptr<CWorkCmd>> &WorkCmdVec = CmdContainer.GetContainer();
vector<Sptr<CWorkCmd>>::iterator iter = WorkCmdVec.begin();
vector<Sptr<CWorkCmd>>::iterator iter_end = WorkCmdVec.end();
for(;iter!=iter_end;iter++)
{
(*iter)->Work(false);
}
}
//执行一个指令集
void CWorkCmdInvoker::ExcuteCmd(vector<CString> &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);
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<Sptr<CWorkCmd>> &WorkCmdVec = CmdContainer.GetContainer();
m_bCancel = false;//指令是否终止
int size = WorkCmdVec.size();//用来计算进度
vector<Sptr<CWorkCmd>>::iterator iter = WorkCmdVec.begin();
vector<Sptr<CWorkCmd>>::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<int>(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