#include "StdAfx.h" #include "WorkCmdInvoker.h" #include "GlobalFunction.h" #include "MsgBox.h" #include "FileMgr.h" #include "WorkCmdContainer.h" #include "ExceptionMsg.h" #include "ProgressMgr.h" #include "CommonFlowMgr.h" #include "ProgramLaserTuiHuo.h" #include "Laser.h" #include "WarningMgr.h" #include "WorkRecord.h" #include "CStringFuc.h" #include "CriticalSection.h" bool gStopAllWrokCmd = false;//全局开关 CWorkCmdInvoker gCmdInvoker_WaferTransfer;//负责管理wafer 传输cmd 的Invoker CWorkCmdInvoker gCmdInvoker_WaferAneal;//负责管理wafer 退火cmd 的Invoker CWorkCmdInvoker gCmdInvoker_ManualOperation;//负责管理手动操作 cmd 的Invoker CWorkCmdInvoker gCmdInvoker_JobQueueCtrl;//用于job 控制的Invoker CWorkCmdInvoker gCmdInvoker_FoupLoadPort1;//用于FoupLoadPort1 控制的Invoker CWorkCmdInvoker gCmdInvoker_FoupLoadPort2;//用于FoupLoadPort2 控制的Invoker CWorkCmdInvoker gCmdInvoker_TrheeLightCtrl;//用于TrheeLightCtrl 控制的Invoker CWorkCmdInvoker gCmdInvoker_ClearWarning;//用于清除报警的Invoker bool gAllCmdInvokerStopFlg = false;//用于停止所有CmdInvoker 的标识 CWorkCmdInvoker::CWorkCmdInvoker(void) { m_bExcutingStop = false;//是否停止cmd 的执行 m_bExcuting = false;//是否正在执行 m_bNeedUpdateCmdList = false;//是否需要刷新cmd 列表 m_bExcutingPause = false;//执行暂停 } CWorkCmdInvoker::~CWorkCmdInvoker(void) { } //指令线程执行函数 UINT ExcuteAllCmdThread(LPVOID pParam) { CWorkCmdInvoker *p = (CWorkCmdInvoker *)pParam; p->ExcuteAllCmdExt(); return 0; } UINT ExcuteCmdThread(LPVOID pParam) { CWorkCmdInvoker *p = (CWorkCmdInvoker *)pParam; p->ExcuteCmdExt(); return 0; } #if 1 //直接执行所有指令 void CWorkCmdInvoker::Excute() { //执行指令集 ExcuteAllCmd(); } //执行指令集中所有的指令------------------------------------------------- void CWorkCmdInvoker::ExcuteAllCmd(bool bNewThread,bool WaitForThread) { if(bNewThread)//在新的线程中执行 { CWinThread* pThread = AfxBeginThread(ExcuteAllCmdThread,this); if(WaitForThread)//等待线程结束 WaitForThreadExit(pThread); } else { ExcuteAllCmdExt(); } } void CWorkCmdInvoker::ExcuteAllCmdExt() { CWorkCmdContainer &CmdContainer = CWorkCmdContainer::GetInstance(); vector> &WorkCmdVec = CmdContainer.GetContainer(); //重新执行的时候重置停止状态 gStopAllWrokCmd = false; m_bCancel = false;//指令是否终止 int size = WorkCmdVec.size();//用来计算进度 CString ErrMsg; int CmdCnt = WorkCmdVec.size();//指令的数量 vector>::iterator iter = WorkCmdVec.begin(); vector>::iterator iter_end = WorkCmdVec.end(); for(double k = 1;iter!=iter_end;iter++,k += 1) { if(!m_bCancel && (gStopAllWrokCmd)) { if(gCommonFlowMgr->IsbStopWorkMsg())//显示停止提示 { CMsgBox MsgBox; if(MsgBox.ConfirmOkCancel(_T("停止执行?"))) { gLogMgr->WriteDebugLog(_T("func : ExcuteAllCmd---->Stop")); m_bCancel = true;//停止 } else//继续执行 { gStopAllWrokCmd = false; } } else { m_bCancel = true;//停止 } } try { m_bCancel = (*iter)->Work(m_bCancel);//如果有指令执行失败,强行终止 //进度 gProgressMgr.SetCurProgress(static_cast(k),size); } catch(CExceptionMsg &Msg) { ErrMsg = Msg.GetMsgStr(); //设置错误提示信息 gCommonFlowMgr->SetErrMsg(ErrMsg); gLogMgr->WriteDebugLog(ErrMsg); m_bCancel = true; //强制结束进度条 gProgressMgr.SetCurProgress(100,100); } } gWorkRecordMgr->EndRecordTime();//停止计时 if(ErrMsg != "" && gCommonFlowMgr->IsbShowErrMsg()) { CMsgBox MsgBox; MsgBox.Show(ErrMsg); } } #endif #if 1 //添加指令 void CWorkCmdInvoker::AddCmd(CWorkCmd *p) { gCriticalSection_WorkCmdInvoker.Lock(); //保存到智能指针 Sptr sPtr(p); m_WorkCmdVec.push_back(sPtr); m_bNeedUpdateCmdList = true;//是否需要刷新cmd 列表 gCriticalSection_WorkCmdInvoker.Unlock(); } void CWorkCmdInvoker::ClearCmd() { gCriticalSection_WorkCmdInvoker.Lock(); m_WorkCmdVec.clear(); m_bNeedUpdateCmdList = true;//是否需要刷新cmd 列表 gCriticalSection_WorkCmdInvoker.Unlock(); }; void CWorkCmdInvoker::ExcuteCmd(bool bNewThread,bool WaitForThread) { if(bNewThread)//在新的线程中执行 { CWinThread* pThread = AfxBeginThread(ExcuteCmdThread,this); if(WaitForThread)//等待线程结束 WaitForThreadExit(pThread); } else { ExcuteCmdExt(); } } void CWorkCmdInvoker::ExcuteCmdExt() { m_bExcuting = true;//标记正在执行 m_InvokerWorkTime.StartRecordTime();//开始计时 CString Log; Log = m_CmdInvokerName + "Start"; gLogMgr->WriteDebugLog(Log); //重新执行的时候重置停止状态 gStopAllWrokCmd = false; m_bCancel = false;//指令是否终止 int size = m_WorkCmdVec.size();//用来计算进度 CString ErrMsg; vector>::iterator iter = m_WorkCmdVec.begin(); vector>::iterator iter_end = m_WorkCmdVec.end(); for(double k = 1;iter!=iter_end;iter++,k += 1) { if(!m_bCancel && (gStopAllWrokCmd || m_bExcutingStop)) { m_bCancel = true;//停止 } (*iter)->SetbExcuting(true); while(m_bExcutingPause)//如果暂停了就一直等待 { Sleep(500); } try { if(!m_bCancel) { CString s; s = Int2Str_LeftZero(k) + " "; s += (*iter)->GetWorkCmdInfoStr(); m_CurExcuteCmdInfo = s; } m_bCancel = (*iter)->Work(m_bCancel);//如果有指令执行失败,强行终止 } catch(CExceptionMsg &Msg) { ErrMsg = Msg.GetMsgStr(); //设置错误提示信息 gCommonFlowMgr->SetErrMsg(ErrMsg); gLogMgr->WriteDebugLog(ErrMsg); m_bCancel = true; } (*iter)->SetbExcuting(false); } //恢复状态 m_bExcutingStop = false; m_bExcutingPause = false; m_bCancel = false; m_InvokerWorkTime.StopRecordTime();//结束计时 Log = m_CmdInvokerName + "End"; gLogMgr->WriteDebugLog(Log); if(ErrMsg != "" && gCommonFlowMgr->IsbShowErrMsg()) { CMsgBox MsgBox; MsgBox.Show(ErrMsg); } m_bExcuting = false; } //是否所有的cmd 都被执行了 bool CWorkCmdInvoker::IsAllCmdExcuted() { bool Ret = true; vector>::iterator iter = m_WorkCmdVec.begin(); vector>::iterator iter_end = m_WorkCmdVec.end(); for(;iter!=iter_end;iter++) { if(!(*iter)->IsbExcuted()) { Ret = false; break; } } return Ret; } void CWorkCmdInvoker::InitCmdList(CListCtrl &List) { //设置风格 List.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置列 int idx = 0; List.InsertColumn(idx,"Idx",LVCFMT_CENTER,50); idx++; List.InsertColumn(idx,"Step Info",LVCFMT_LEFT,400,-1); idx++; } void CWorkCmdInvoker::UpdateCmdList(CListCtrl &List) { gCriticalSection_WorkCmdInvoker.Lock(); int size = m_WorkCmdVec.size(); if(m_bNeedUpdateCmdList) { List.DeleteAllItems(); } else//防止行数量不一致 { if(size != List.GetItemCount()) return; } int ExcuteIdx = 0;//当前执行的cmd for(int k=0;kGetWorkCmdInfoStr(); if(m_bNeedUpdateCmdList) List.InsertItem(k," "); List.SetItemText(k,0,Int2Str_LeftZero(k+1)); List.SetItemText(k,1,CmdInfoStr); if(m_WorkCmdVec[k]->IsbExcuted()) ExcuteIdx = k; } m_bNeedUpdateCmdList = false; gCriticalSection_WorkCmdInvoker.Unlock(); } COLORREF CWorkCmdInvoker::GetCmdListColor(int Idx) { COLORREF c = RGB_WHITE; int size = m_WorkCmdVec.size(); if(Idx>=0&&IdxIsbExcuted()) c = RGB_BLUE1; if(m_WorkCmdVec[Idx]->IsbExcuting()) c = RGB_YELLOW; } return c; } //设置暂停 void CWorkCmdInvoker::SetbExcutingPause(bool b) { m_bExcutingPause = b; if(b) { CString log("Flow--->"); log += m_CmdInvokerName; log += " ExcutingPause"; gLogMgr->WriteDebugLog(log); } } #endif