📄 cmiocpmudule.cpp
字号:
#include "CMIocpAccept.h"
#include "CMIocpMudule.h"
#include "CMInetAddress.h"
#include <MatrixCore/Pattern/CMSingleton.h>
using namespace MatrixCore::Pattern;
//CMSingleton<CMDebug>::getInstance()
CMIocpMudule* CMIocpMudule::m_pSelfInstance = 0;
int CMIocpMudule::m_iThreadCurrentCnt = 0;
// CMSingleton<CMDebug> *pDebugALL;
CMIocpMudule::CMIocpMudule()
: m_hWorkerIOCP( 0 )
{
m_UserCount = 0;
m_pIOAccepter= NULL;
m_pIOAccepter = NULL;
for(int i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
{
m_pWorkerThread[i] = NULL;
}
}
CMIocpMudule::CMIocpMudule(char * pIPAddress,int iPort)
: m_hWorkerIOCP( 0 )
{
GetInstance()->SetIPAddress(pIPAddress,iPort);
}
CMIocpMudule::~CMIocpMudule()
{
int i;
CMWorkerThread::m_stThreadLoop = false;
//静饭靛啊 磷阑锭鳖瘤 扁笛赴促..
CMOVERLAPPED *ov = NULL;
//ov.eState = eEXIT;
int spin = m_iThreadCurrentCnt;
for (i = 0; i < spin ; i++)
{
PostQueuedCompletionStatus(m_hWorkerIOCP,0,0,ov);
}
while(m_iThreadCurrentCnt > 0)
{
Sleep(1000);
}
if(m_pIOAccepter != NULL)
{
delete m_pIOAccepter;
m_pIOAccepter = NULL;
}
for( i = 0 ; i < m_Def_Workerthread ; i++ )
{
if( m_pWorkerThread[i] != NULL)
delete m_pWorkerThread[i];
}
CMSingleton<CMDebug>::releaseInstance();
}
CMIocpMudule* CMIocpMudule::GetInstance()
{
if( m_pSelfInstance == 0 )
{
m_pSelfInstance = new CMIocpMudule();
}
return m_pSelfInstance;
}
void CMIocpMudule::ReleaseInstance()
{
if( m_pSelfInstance != 0 )
{
delete m_pSelfInstance;
m_pSelfInstance = 0;
}
}
BOOL CMIocpMudule::AddWorkerThead(LPTHREAD_START_ROUTINE StartRoutine)
{
int i;
if(NULL == StartRoutine)
{
for( i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
{
if(m_pWorkerThread[i] == NULL)
{
m_pWorkerThread[i] = new CMWorkerThread();
m_pWorkerThread[i]->begin();
m_iThreadCurrentCnt++;
break;
}
}
}
else
{
for( i = 0 ; i < DEF_WORKERTHREADMAX ; i++ )
{
if(m_pWorkerThread[i] == NULL)
{
m_pWorkerThread[i] = new CMWorkerThread(StartRoutine);
m_pWorkerThread[i]->begin();
m_iThreadCurrentCnt++;
break;
}
}
}
return TRUE;
}
BOOL CMIocpMudule::DelWorkerThead()
{
m_iThreadCurrentCnt--;
return m_iThreadCurrentCnt;
}
bool CMIocpMudule::Initialize(char * pIPAddress,int iPort
,int iMaxAcceptUser,int WorkerThreadMax,LPTHREAD_START_ROUTINE StartRoutine)
{
GetInstance()->SetIPAddress(pIPAddress,iPort);
if(WorkerThreadMax > 0 && WorkerThreadMax < DEF_WORKERTHREADMAX)
{
m_Def_Workerthread = WorkerThreadMax;
}
else
{
//檬扁拳 角菩.
// default 蔼栏肺 技泼
m_Def_Workerthread = DEF_WORKERTHREAD;
}
CMSingleton<CMDebug>::getInstance()->initialize(CMDebug::DEBUGTYPE_FILE,"ERR/NetworkErr");
CMString IPstring = CMInetAddress::GetHostAddress();
memset(m_pIPAdress,0,sizeof m_pIPAdress);
memcpy(m_pIPAdress,IPstring.getBuffer(),IPstring.length());
m_hWorkerIOCP = ::CreateIoCompletionPort( INVALID_HANDLE_VALUE,
0, 0,
4 ); //Number of concurrently executed threads 叼弃飘 蔼 汲沥
if( m_hWorkerIOCP == NULL )
return false;
int i;
//况目 静饭靛 积己 DEF_WORKERTHREAD肮荐 父怒 积己 茄促..
// StartRoutine俊 器牢磐啊 逞绢 柯促搁 况农 静饭靛啊 扼捞宏矾府 官冰俊辑 捣促绰 捞具扁烙..
if(NULL == StartRoutine)
{
for( i = 0 ; i < m_Def_Workerthread ; i++ )
{
m_pWorkerThread[i] = new CMWorkerThread();
m_pWorkerThread[i]->begin();
m_iThreadCurrentCnt++;
}
}
else
{
for( i = 0 ; i < m_Def_Workerthread ; i++ )
{
m_pWorkerThread[i] = new CMWorkerThread(StartRoutine);
m_pWorkerThread[i]->begin();
m_iThreadCurrentCnt++;
}
}
//竣剂飘 包府磊甫 积己
m_pIOAccepter = new CMIocpAccept(iMaxAcceptUser);
m_ListenSock = m_pIOAccepter->GetListenSocket();
return true;
}
int CMIocpMudule::SetServerSocket(char *pIP,int iPort)
{
m_pIOAccepter->SetServerAccept(pIP,iPort);
return 1;
}
INT CMIocpMudule::GetWorkerThreadSize()
{
return m_Def_Workerthread;
}
HANDLE CMIocpMudule::GetWorkerIOCPHandle()
{
return m_hWorkerIOCP;
}
bool CMIocpMudule::AddHandleToIOCP( HANDLE handle, DWORD keyValue )
{
::CreateIoCompletionPort( handle, m_hWorkerIOCP, keyValue, 0 );
return true;
}
BOOL CMIocpMudule::SetIPAddress(char * pIPAddress,int iPort)
{
if(pIPAddress != NULL)
strcpy(m_pIPAdress,pIPAddress);
else
{
memset(m_pIPAdress,0,sizeof(m_pIPAdress));
}
m_iPort = iPort;
return TRUE;
}
BOOL CMIocpMudule::GetIPAddress(char * pIPAddress,int* iPort)
{
int size;
size = strlen(m_pIPAdress);
if(size == 0)
{
return FALSE;
}
strcpy(pIPAddress,m_pIPAdress);
*iPort = m_iPort;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -