286 lines
6.2 KiB
C++
286 lines
6.2 KiB
C++
|
#include "StdAfx.h"
|
|||
|
#include "Agv.h"
|
|||
|
#include "ModuleProcess.h"
|
|||
|
#include "AgvMainDialog.h"
|
|||
|
int g_ulTerminal = 0;
|
|||
|
|
|||
|
void g_PipeCallBack(void* pObj, int lMsgId, WPARAM wparam, LPARAM lparam)
|
|||
|
{
|
|||
|
CModuleProcess* pModule = (CModuleProcess*)pObj;
|
|||
|
pModule->PipeCallBack(lMsgId, wparam, lparam);
|
|||
|
}
|
|||
|
|
|||
|
CModuleProcess::CModuleProcess(CAgvMainDialog *pMainWnd, CString strModulePath, CString strModuleName, int lModuleIndex)
|
|||
|
{
|
|||
|
m_lModuleIndex = lModuleIndex;
|
|||
|
m_strModulePath = strModulePath;
|
|||
|
m_strModuleName = strModuleName;
|
|||
|
m_hProcessManageThr = NULL;
|
|||
|
m_bAcitv = FALSE;
|
|||
|
m_hWnd = pMainWnd->m_hWnd;
|
|||
|
m_pAgvMainWnd = pMainWnd;
|
|||
|
m_bIsConnectModule = FALSE;
|
|||
|
m_lReStartCount = 0;
|
|||
|
m_lState = 0;
|
|||
|
ZeroMemory(&m_pi,sizeof(m_pi)); //<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
m_pstPipeServer = CCEXPipeServerBase::CreateObj();
|
|||
|
m_nDebug = 0;
|
|||
|
}
|
|||
|
|
|||
|
CModuleProcess::~CModuleProcess(void)
|
|||
|
{
|
|||
|
if (NULL != m_pstPipeServer)
|
|||
|
{
|
|||
|
delete m_pstPipeServer;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
unsigned int __stdcall g_ProcessManageThr(void* pParam)
|
|||
|
{
|
|||
|
((CModuleProcess*)pParam)->ProcessManageThr();
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
|
|||
|
BOOL CModuleProcess::Start(int nDebug)
|
|||
|
{
|
|||
|
m_nDebug = nDebug;
|
|||
|
|
|||
|
if (NULL != m_hProcessManageThr)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
if (m_strPipeName.IsEmpty())
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
m_bAcitv = TRUE;
|
|||
|
|
|||
|
|
|||
|
if (m_nDebug == 1)
|
|||
|
{
|
|||
|
if (NULL == m_pstPipeServer)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
m_pstPipeServer->RegisterCall(g_PipeCallBack, this);
|
|||
|
m_pstPipeServer->Start(m_strPipeName);
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
m_hProcessManageThr = (HANDLE)_beginthreadex(NULL, 0, g_ProcessManageThr, this, 0, NULL);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
//ֹͣģ<D6B9><C4A3>
|
|||
|
void CModuleProcess::Stop()
|
|||
|
{
|
|||
|
if (NULL == m_hProcessManageThr)
|
|||
|
{
|
|||
|
LogOutToFile("CModuleProcess::Stop() already stop. [%s]", m_strModulePath);
|
|||
|
return ;
|
|||
|
}
|
|||
|
|
|||
|
LogOutToFile("CModuleProcess::Stop() bg [%s]", m_strModulePath);
|
|||
|
|
|||
|
m_bAcitv = FALSE;
|
|||
|
if (m_pstPipeServer->IsConnect())
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹܵ<D3B9><DCB5><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>Ҫ<EFBFBD>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿ڣ<CBBF><DAA3><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ƽ̨<C6BD>˹رպ<D8B1><D5BA>ͻ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>˳<EFBFBD>
|
|||
|
m_pstPipeServer->Stop();
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
//m_pstPipeServer->Stop();
|
|||
|
//<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>ƽ̨<C6BD><CCA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƽ̨<C6BD>Ĺرգ<D8B1><D5A3><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ư<EFBFBD><C6B0><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
TerminateProcess(m_pi.hProcess, 0);
|
|||
|
}
|
|||
|
|
|||
|
if (WAIT_TIMEOUT == WaitForSingleObject(m_hProcessManageThr, 5000))
|
|||
|
{
|
|||
|
TerminateProcess(m_pi.hProcess, 0);
|
|||
|
Sleep(500);
|
|||
|
LogOutToFile("CModuleProcess::Stop() timeout [%s]", m_strModulePath);
|
|||
|
TerminateThread(m_hProcessManageThr, 0);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
LogOutToFile("CModuleProcess::Stop() succ[%s]", m_strModulePath);
|
|||
|
}
|
|||
|
|
|||
|
m_hProcessManageThr = NULL;
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
int CModuleProcess::GetStatus()
|
|||
|
{
|
|||
|
if (NULL == m_hProcessManageThr)
|
|||
|
{
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
return m_lState;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
BOOL CModuleProcess::SendDataToModule(int lMsgId, const char* pData, int lLen)
|
|||
|
{
|
|||
|
if (NULL == m_pstPipeServer)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
m_pstPipeServer->SendeMsg(lMsgId, pData, lLen);
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨѶ<CDA8>Ĺܵ<C4B9><DCB5>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//1<><31>lparam > 0ʱ<30><CAB1>wparamΪ<6D><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>lparamΪ<6D><CEAA><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
//2<><32>lparam<61><6D>-1<>ܵ<EFBFBD><DCB5><EFBFBD><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD>-2<>ܵ<EFBFBD><DCB5>Ͽ<EFBFBD><CFBF><EFBFBD>-3<>ܵ<EFBFBD><DCB5>쳣
|
|||
|
void CModuleProcess::PipeCallBack(int lMsgId, WPARAM wparam, LPARAM lparam)
|
|||
|
{
|
|||
|
if (CEXPIPE_NEW_DATA == lMsgId)
|
|||
|
{
|
|||
|
PIPE_DATA_STRUCT* pPipeData = (PIPE_DATA_STRUCT*)wparam;
|
|||
|
if (pPipeData->lDataLen + sizeof(PIPE_DATA_STRUCT) - sizeof(char[4]) != (int)lparam)
|
|||
|
{
|
|||
|
return ;//<2F><><EFBFBD><EFBFBD>ͨѶ<CDA8>쳣
|
|||
|
}
|
|||
|
|
|||
|
Json::Reader reader;
|
|||
|
Json::Value root;
|
|||
|
CString strData = "data=";
|
|||
|
if (reader.parse(pPipeData->acData, root))
|
|||
|
{
|
|||
|
CString strSender = root["sender"].asString().c_str();
|
|||
|
CString strReceiver = root["receiver"].asString().c_str();
|
|||
|
|
|||
|
//WCS->WMS<4D><53><EFBFBD><EFBFBD>Ϣ
|
|||
|
if (strReceiver == "WMS")
|
|||
|
{
|
|||
|
m_httpClent.GenericPost(strData + pPipeData->acData);
|
|||
|
CString strMsg = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>WMS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ:";
|
|||
|
strMsg += pPipeData->acData;
|
|||
|
m_pAgvMainWnd->AddLog2Edit(strMsg);
|
|||
|
}
|
|||
|
else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
{
|
|||
|
CModuleProcess *pModuleProcess = m_pAgvMainWnd->GetModuleByName(strReceiver);
|
|||
|
if (NULL != pModuleProcess)
|
|||
|
{
|
|||
|
pModuleProcess->SendDataToModule(MAIN_2_MODULE_WMS, pPipeData->acData, pPipeData->lDataLen);
|
|||
|
CString strMsg = "ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Plugin<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ:";
|
|||
|
strMsg += pPipeData->acData;
|
|||
|
m_pAgvMainWnd->AddLog2Edit(strMsg);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
else if (CEXPIPE_DIS_CLIENT == lMsgId)
|
|||
|
{
|
|||
|
//<2F>ܵ<EFBFBD><DCB5>Ͽ<EFBFBD><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//PostMessage(WM_CLOSE, NULL, NULL);
|
|||
|
TRACE("<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>ѶϿ<EFBFBD>\r\n");
|
|||
|
}
|
|||
|
else if (CEXPIPE_NEW_CLIENT == lMsgId)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD>ӳɹ<D3B3>
|
|||
|
//PostMessage(WM_PIPE_CONNECT_OK, NULL, NULL);
|
|||
|
PostMessage(m_hWnd, WM_MODULE_CONNECT_ID, (WPARAM)this, NULL);
|
|||
|
TRACE("<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\r\n");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
TRACE("<EFBFBD>쳣<EFBFBD>ܵ<EFBFBD><EFBFBD><EFBFBD>Ϣ[%d]\r\n", lMsgId);
|
|||
|
}
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
void CModuleProcess::ProcessManageThr()
|
|||
|
{
|
|||
|
int lDelay = 3000;
|
|||
|
for (; TRUE == m_bAcitv;)
|
|||
|
{
|
|||
|
m_lReStartCount++;
|
|||
|
|
|||
|
|
|||
|
m_lState = 1;
|
|||
|
PostMessage(m_hWnd, WM_UPDATE_MODULE_STATUS, NULL, NULL);
|
|||
|
|
|||
|
if (FALSE == StartModule())
|
|||
|
{
|
|||
|
//lDelay *= 2;//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>˫<EFBFBD><CBAB>ʱ<EFBFBD><CAB1>
|
|||
|
}
|
|||
|
m_lState = 2;
|
|||
|
PostMessage(m_hWnd, WM_UPDATE_MODULE_STATUS, NULL, NULL);
|
|||
|
|
|||
|
TRACE("<EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>쳣<EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>[%d ms]<5D><><EFBFBD><EFBFBD>\r\n", lDelay);
|
|||
|
for (int i = 0; i < lDelay && TRUE == m_bAcitv; i+=20)
|
|||
|
{
|
|||
|
Sleep(20);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
BOOL CModuleProcess::StartModule()
|
|||
|
{
|
|||
|
if (NULL == m_pstPipeServer)
|
|||
|
{
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
if (m_pstPipeServer->IsAcitve())
|
|||
|
{
|
|||
|
//ģ<><C4A3><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
//Stop();
|
|||
|
m_pstPipeServer->RegisterCall(g_PipeCallBack, this);
|
|||
|
m_pstPipeServer->Start(m_strPipeName);
|
|||
|
|
|||
|
STARTUPINFO si; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̲<EFBFBD><CCB2><EFBFBD>
|
|||
|
CString strCommend;
|
|||
|
strCommend.Format("-u %u -pipe %s", g_ulTerminal, m_strPipeName.GetBuffer());
|
|||
|
|
|||
|
//<2F>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD>
|
|||
|
ZeroMemory(&si,sizeof(si)); //<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ZeroMemory(&m_pi,sizeof(m_pi)); //<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
si.dwFlags =STARTF_USESHOWWINDOW;//<2F><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
si.wShowWindow=SW_SHOW;//<2F><><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
|||
|
//Sleep(999999999);
|
|||
|
if(FALSE == CreateProcess(m_strModulePath.GetBuffer(), strCommend.GetBuffer(), NULL, NULL, false, 0, NULL, NULL, &si, &m_pi))
|
|||
|
{
|
|||
|
ZeroMemory(&m_pi,sizeof(m_pi)); //<2F>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
LogOutToFile("Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>:%s[%s]", m_strModulePath.GetBuffer(), strCommend.GetBuffer());
|
|||
|
|
|||
|
m_pstPipeServer->Stop();
|
|||
|
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
LogOutToFile("[info] ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[%s][%s]", m_strModulePath, strCommend.GetBuffer());
|
|||
|
TRACE("[info] ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[%s][%s]", m_strModulePath, strCommend.GetBuffer());
|
|||
|
|
|||
|
//Ӧ<>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if (WAIT_OBJECT_0 != WaitForSingleObject(m_pi.hThread, INT_MAX))
|
|||
|
{
|
|||
|
m_pstPipeServer->Stop();
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
m_pstPipeServer->Stop();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|