⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serviceaction.cpp

📁 一个手机通信的源代码 一个手机通信的源代码一个手机通信的源代码
💻 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 + -