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++
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 |