fast/Platform/ModuleProcess.cpp

286 lines
6.2 KiB
C++
Raw Normal View History

2025-01-20 10:30:01 +08:00
#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;
}