📄 serviceaction.cpp
字号:
// ServiceAction.cpp: implementation of the CServiceAction class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ServiceAction.h"
#include "MtThread.h"
#include "MoThread.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CServiceAction::CServiceAction(CString& Province)
{
m_csProvince=Province;
m_LoginBaseInfo.m_ICPID="";
m_LoginBaseInfo.m_MoLocalPort=0;
m_LoginBaseInfo.m_MoPassword="";
m_LoginBaseInfo.m_MoUserName="";
m_LoginBaseInfo.m_MtPassword="";
m_LoginBaseInfo.m_MtRemoteIP="";
m_LoginBaseInfo.m_MtRemotePort=0;
m_LoginBaseInfo.m_MtUserName="";
m_LoginBaseInfo.m_ServiceNumber="";
m_QueueBaseInfo.m_ControlQueuePath="";
m_QueueBaseInfo.m_InQueuePath="";
m_QueueBaseInfo.m_OutQueuePath="";
m_QueueBaseInfo.m_ReportQueuePath="";
m_QueueBaseInfo.m_SpyQueuePath="" ;
m_pMoThread=NULL;
m_pMtThread=NULL;
//关于显示各线程运行状况的设置
m_bStatusInfoChange=FALSE;
m_bSaveDisplayInfo=FALSE;//是否保存显示信息
m_CurArrayPos =0;
m_LostDisplayInfo =0;
m_DisplayType=0;
CreateMoThreads(0,0);//创建Mo线程
m_DisplayIndex=0;//显示线程索引
m_DisplayIndex=0;
}
CServiceAction::~CServiceAction()
{
for(int i = 0; i < m_ProvinceArray.GetSize(); i++)
{
StructProvince * pStructProvince = NULL ;
pStructProvince = m_ProvinceArray.GetAt(i) ;
delete pStructProvince ;
pStructProvince = NULL ;
}
}
//Mo服务初始化
void CServiceAction::MoInitConnect(CString RemoteIP, UINT RemotePort, CString ICPID, CString SourceNode,CString UserName, CString Password, UINT LocalPort,CString ServiceNumber,int Index,CString ProvinceName)
{
StructProvince* pProvince=m_ProvinceArray.GetAt(Index);
pProvince->m_LoginIngo.m_ICPID=ICPID;
pProvince->m_LoginIngo.m_SourceNode=SourceNode;
pProvince->m_LoginIngo.m_MoLocalPort=LocalPort;
pProvince->m_LoginIngo.m_MoPassword=Password;
pProvince->m_LoginIngo.m_MoUserName=UserName;
pProvince->m_LoginIngo.m_MtPassword=Password;
pProvince->m_LoginIngo.m_MtRemoteIP=RemoteIP;
pProvince->m_LoginIngo.m_MtRemotePort=RemotePort;
pProvince->m_LoginIngo.m_MtUserName=UserName;
pProvince->m_LoginIngo.m_ServiceNumber =ServiceNumber;
pProvince->m_ProvinceName =ProvinceName;
//初始化MoThreads
m_pMoThread->InitConnectParam(m_ProvinceArray.GetAt(Index)->m_ProvinceName ,m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_MtRemoteIP,
m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_MoLocalPort,
m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_ICPID,
m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_MtUserName,
m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_MtPassword,
m_ProvinceArray.GetAt(Index)->m_LoginIngo.m_ServiceNumber,Index,
m_ProvinceArray.GetAt(Index)->m_QueueInfo.m_InQueuePath ,
m_ProvinceArray.GetAt(Index)->m_QueueInfo.m_ReportQueuePath,
ServiceNumber);
}
//开始运行,包括创建并使用线程
BOOL CServiceAction::MoStartCmppServer(int& MoThreadNum,int MtThreadNum,int Index)
{
if(Index<0||Index>=m_ProvinceArray.GetSize())
return FALSE;
//创建Mt线程
if(!CreateMtThreads(MtThreadNum,Index))
return FALSE;
return TRUE;
}
//关闭服务
void CServiceAction::MoCloseCmppServer()
{
int i,j;
for(i=0;i<m_ProvinceArray.GetSize();i++)
{
for(j=0;j<m_ProvinceArray.GetAt(i)->m_ThreadsArray.GetSize();j++)
{
m_ProvinceArray.GetAt(i)->m_ThreadsArray.GetAt(j)->KillThread();
}
m_ProvinceArray.GetAt(i)->m_ThreadsArray.RemoveAll();
}
m_ProvinceArray.RemoveAll();
if(m_pMoThread!=NULL)
m_pMoThread->KillThread();
}
//初始化队列路径
void CServiceAction::InitQueuePath(CString InQueuePath, CString OutQueuePath, CString ReportQueuePath, CString SpyQueuePath,CString ControlQueuePath,int Index)
{
StructProvince* pProvince=m_ProvinceArray.GetAt(Index);
pProvince->m_QueueInfo.m_ControlQueuePath=ControlQueuePath;
pProvince->m_QueueInfo.m_InQueuePath=InQueuePath;
pProvince->m_QueueInfo.m_OutQueuePath=OutQueuePath;
pProvince->m_QueueInfo.m_ReportQueuePath=ReportQueuePath;
pProvince->m_QueueInfo.m_SpyQueuePath=SpyQueuePath;
}
//由Mo或Mt线程调用,保存可能要显示的信息
void CServiceAction::SaveStatusInfo(CString &MsgType, CString &ChildType, CString &MsgContent,int Index)
{
if(m_DisplayType==0)//禁止显示任何消息,此时不保存任何状态信息
return;
if(m_DisplayIndex!=Index)
return;
m_Mutex.Lock();
if(m_CurArrayPos>=DISPLAYBUFFERLEN)
{
m_LostDisplayInfo=m_LostDisplayInfo +DISPLAYBUFFERLEN;//有DISPLAYBUFFERLEN千条消息还未显示就消失了
m_CurArrayPos=0;
}
CTime CurTime=CTime::GetCurrentTime();
CString csContent;
csContent.Format("%s %s",CurTime.Format("%Y-%m-%d %H:%M:%S"),MsgContent);
m_DisplayInfoArray[m_CurArrayPos].m_MsgType=MsgType;
m_DisplayInfoArray[m_CurArrayPos].m_ChildType=ChildType;
m_DisplayInfoArray[m_CurArrayPos].m_MsgContent=csContent;
m_CurArrayPos++;
m_Mutex.Unlock();
}
void CServiceAction::GetStatusNewInfo(CString &csOutMsg, int &LostedMsg)
{
m_Mutex.Lock();
if(m_CurArrayPos==0)
{
m_Mutex.Unlock();
csOutMsg="";
return;
}
int i;
for(i=m_CurArrayPos-1;i>=0;i--)
{
csOutMsg=csOutMsg+m_DisplayInfoArray[i].m_MsgContent;
csOutMsg=csOutMsg+"\r\n";
m_DisplayInfoArray[i].m_MsgContent.Empty();
}
LostedMsg=m_LostDisplayInfo;
m_CurArrayPos=0;
//Slock.Unlock();
m_Mutex.Unlock();
}
//禁止显示
void CServiceAction::SetDisplayForbidden()
{
m_DisplayType =0;
}
//显示所有消息
void CServiceAction::SetDisplayAllInfo()
{
m_DisplayType=1;
}
//得到发送、接收、状态报告和自动重连的次数
void CServiceAction::GetMsgNum(UINT &SubmitMsgs, UINT &DeliverMsgs, UINT &DeliveredMsgs,UINT& ReconnectTimes,int& ThreadIndex)
{
if(ThreadIndex<m_ProvinceArray.GetAt(m_DisplayIndex)->m_ThreadsArray.GetSize())
{
m_ProvinceArray.GetAt(m_DisplayIndex)->m_ThreadsArray.GetAt(ThreadIndex)->GetSubmitMsgs(SubmitMsgs,ReconnectTimes);
DeliverMsgs=0;
DeliveredMsgs=0;
}
else
{
DeliverMsgs=m_pMoThread ->m_DeliverMsgs;
DeliveredMsgs=m_pMoThread->m_DeliveredMsgs;
SubmitMsgs=0;
ReconnectTimes=m_pMoThread->m_ReconnectTimes;
}
}
//得到连接状态字符串
void CServiceAction::GetConnectStatus(CString &csConnectStatus,int& ThreadIndex)
{
csConnectStatus="连接正常";
}
BOOL CServiceAction::CreateMoThreads(int Threadnum,int Index)
{
int BaseNum=0;
BaseNum=BaseNum+10;//设置超时
m_pMoThread=new CMoThread(this,BaseNum*1000);
//m_MoThreadpArray.Add(m_pMoThread);
return TRUE;
}
//设置保存状态报告的标志
void CServiceAction::SetSaveReport(BOOL bSave)
{
}
//创建MtThreads
BOOL CServiceAction::CreateMtThreads(int ThreadsNum,int Index)
{
//创建Mt线程
int i=0,SequenceID=0;
StructProvince* pProvince=m_ProvinceArray.GetAt(Index);
for(i=0;i<ThreadsNum;i++)
{
SequenceID=SequenceID+200000*i;
m_pMtThread=new CMtThread(pProvince->m_QueueInfo.m_OutQueuePath,pProvince->m_QueueInfo.m_ReportQueuePath,this,pProvince->m_ProvinceName);
m_pMtThread->InitConnectParam(pProvince->m_LoginIngo.m_MtRemoteIP,pProvince->m_LoginIngo.m_MtRemotePort,
pProvince->m_LoginIngo.m_ICPID,pProvince->m_LoginIngo.m_SourceNode,
pProvince->m_LoginIngo.m_MtUserName,
pProvince->m_LoginIngo.m_MtPassword,pProvince->m_LoginIngo .m_ServiceNumber,SequenceID);
if(!CreateMSMQThread(m_pMtThread,NULL,0))
{
delete m_pMtThread;
m_pMtThread=NULL;
return FALSE;
}
m_pMtThread->m_ProvinceIndex=Index;
pProvince->m_ThreadsArray.Add(m_pMtThread);
}
return TRUE;
}
//初始化省份的数组,告知系统有几个省份
void CServiceAction::InitProvinceArray(int ProvinceNum)
{
if(ProvinceNum<=0)
return;
int i;
for(i=0;i<ProvinceNum;i++)
{
StructProvince* NewProvince=new StructProvince;
m_ProvinceArray.Add(NewProvince);
}
}
//启动moThread
void CServiceAction::StartMoThread()
{
if(!CreateMoThread(m_pMoThread,NULL,0))
{
delete m_pMoThread;
m_pMoThread=NULL;
return ;
}
}
//控制显示省份
void CServiceAction::SetDisplayProvince(int index)
{
m_DisplayIndex=index;
}
void CServiceAction::SaveWrongtoLog( CString& csContent)
{
m_LogMutex.Lock();
CFile file;
if(!file.Open("LiantongWrong.txt",CFile::modeWrite|CFile::modeRead))
{
file.Open("LiantongWrong.txt",CFile::modeCreate|CFile::modeWrite|CFile::modeRead);
}
file.SeekToEnd();
file.Write(csContent.GetBuffer(csContent.GetLength()),csContent.GetLength());
file.Close();
m_LogMutex.Unlock();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -