📄 nwsendthread.cpp
字号:
#include "StdAfx.h"
#include "NWSendThread.h"
NWSendThread NWSendThread::m_Instance ;
NWSendThread::NWSendThread(void)
{
m_lsSendBufferList.SetMaxCount(MAX_SENDTHREAD_BUFFER_COUNT);
}
NWSendThread::~NWSendThread(void)
{
}
int NWSendThread::Init()
{
MYEXCEPTIONFUNC_START();
m_hHaveMSGInfoEvent = CreateEvent( 0 , true , false , 0 ) ;
if (m_hHaveMSGInfoEvent == 0
|| m_hHaveMSGInfoEvent == INVALID_HANDLE_VALUE )
{
throw_Memory("Create m_hHaveMSGInfoEvent Error") ;
}
m_hHaveRelaseEvent = CreateEvent( 0 , true , true , 0 ) ;
if (m_hHaveRelaseEvent == 0
|| m_hHaveRelaseEvent == INVALID_HANDLE_VALUE )
{
throw_Memory("Create m_hHaveRelaseEvent Error") ;
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("NWSendThread::Init()");
}
int NWSendThread::Run()
{
MYEXCEPTIONFUNC_START();
HANDLE handlesToWaitFor[2];
handlesToWaitFor[0] = m_hExitEvent;
handlesToWaitFor[1] = m_hHaveMSGInfoEvent ;
while (m_bContinue)
{
DWORD waitResult = ::WaitForMultipleObjects( 2,
handlesToWaitFor,
false,
INFINITE );
if (waitResult == WAIT_TIMEOUT)
{
Trace("NWSendThread::Run::WaitForMultipleObjects timeout");
continue ;
}
else if ( waitResult == WAIT_OBJECT_0 )
{
Trace("NWSendThread::线程收倒退出事件");
break;
}
else if (waitResult == WAIT_OBJECT_0 + 1)
{
MYEXCEPTIONFUNC_START();
pCIOBuffer pIOBuffer = NULL ;
iRetCode = GetOneBuffer(pIOBuffer);
if (iRetCode !=0 || pIOBuffer == NULL)
{
throw_NWException("iRetCode !=0 || pIOBuffer == NULL");
}
iRetCode = pIOBuffer->StartSendBuf(m_SendSocket);
{
throw_NWException("StartSendBuf Error ");
}
MYEXCEPTIONFUNC_NOREV_END("CMSGProcessThread::Run::DO");
}
}
iRetCode = 0 ;
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("NWSendThread::Run()");
}
int NWSendThread::UnInit()
{
MYEXCEPTIONFUNC_START();
if ( m_hHaveMSGInfoEvent != 0
&& m_hHaveMSGInfoEvent != INVALID_HANDLE_VALUE )
{
CloseHandle( m_hHaveMSGInfoEvent ) ;
m_hHaveMSGInfoEvent = 0 ;
}
if ( m_hHaveRelaseEvent != 0
&& m_hHaveRelaseEvent != INVALID_HANDLE_VALUE )
{
CloseHandle( m_hHaveRelaseEvent ) ;
m_hHaveRelaseEvent = 0 ;
}
iRetCode= 0 ;
MYEXCEPTIONFUNC_END("NWSendThread::UnInit()");
}
int NWSendThread::WriteOneBuff(pCIOBuffer pSendBuffer)
{
MYEXCEPTIONFUNC_START();
HANDLE hWaitHandle[2] ;
DWORD dwWaitRev = 0 ;
hWaitHandle[0] = m_hExitEvent;
hWaitHandle[1] = m_hHaveRelaseEvent ;
if ( hWaitHandle[0] == 0
|| hWaitHandle[1] == 0
|| hWaitHandle[0] == INVALID_HANDLE_VALUE
|| hWaitHandle[1] == INVALID_HANDLE_VALUE )
{
throw_NWException("on NWIOBufferManager::AddBufferToList") ;
}
dwWaitRev = WaitForMultipleObjects( 2, hWaitHandle , false , -1 ) ;//无限等待有数据,或者退出
if ( dwWaitRev == WAIT_TIMEOUT )
{
Fail("m_lsSendBufferList::AddToTail Timer Out ") ;//一直没有数据
return -1;
}
else if ( dwWaitRev == WAIT_OBJECT_0 )
{
Trace(" NWSendThread 收到退出命令。 " ) ;
return 1;
}
else if ( dwWaitRev == WAIT_OBJECT_0 + 1 )
{
m_lsSendBufferList.LockList();
try
{
iRetCode = m_lsSendBufferList.AddTail( pSendBuffer ) ;
if ( iRetCode != 0 )
{
Fail(" m_lTempMsgDataList.AddTail Error ") ;
throw 0 ;
}
if ( m_lsSendBufferList.GetCount() >= (MAX_SENDTHREAD_BUFFER_COUNT -1))
{
if(!ResetEvent(m_hHaveRelaseEvent))
{
//缓冲满,要等待释放后再继续添加
Fail("Reset m_hHaveRelaseEvent Error ");
throw 0 ;
}
}
if ( ! SetEvent( m_hHaveMSGInfoEvent ) )
{
iRetCode = -1 ;
Fail("SetEvent m_hHaveMSGInfoEvent Error ") ;
throw 0 ;
}
iRetCode = 0 ;
m_lsSendBufferList.UnLockList();
}
catch (...)
{
m_lsSendBufferList.UnLockList();
}
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("NWSendThread::WriteOneBuff");
}
int NWSendThread::GetOneBuffer(pCIOBuffer & pSendBuffer)
{
MYEXCEPTIONFUNC_START();
int iRetCode = 0 ;
HANDLE hWaitHandle[2] ;
hWaitHandle[0] = m_hExitEvent ;
hWaitHandle[1] = m_hHaveMSGInfoEvent ;
if ( hWaitHandle[0] == 0
|| hWaitHandle[1] == 0
|| hWaitHandle[0] == INVALID_HANDLE_VALUE
|| hWaitHandle[1] == INVALID_HANDLE_VALUE )
{
throw_NWException("MSGMinusTmpList::GetFromHead") ;
}
if ( m_lsSendBufferList.IsEmpty() )
{
if ( ! ResetEvent( m_hHaveMSGInfoEvent ) )
{
Fail("Reset m_hHaveMSGInfoEvent Error ") ;
return -1;
};
}
DWORD dwWaitRev = 0 ;
dwWaitRev = WaitForMultipleObjects( 2, hWaitHandle , false , 10 *1000 ) ;//无限等待有数据,或者退出
if ( dwWaitRev == WAIT_TIMEOUT )
{
Fail("m_lsSendBufferList::GetFromHead Timer Out ") ;//一直没有数据
return -1 ;
}
else if ( dwWaitRev == WAIT_OBJECT_0 )
{
Trace(" NWSendThread 收到退出命令。 " ) ;
return 1 ;
}
else if ( dwWaitRev == WAIT_OBJECT_0 + 1 )
{
pSendBuffer = NULL ;
pCIOBuffer pBuffer = NULL ;
m_lsSendBufferList.LockList();
try
{
m_lsSendBufferList.RemoveHead(pBuffer);
if ( m_lsSendBufferList.GetCount() < (MAX_SENDTHREAD_BUFFER_COUNT * 3/4 ))
{
if ( ! SetEvent( m_hHaveRelaseEvent ) )
{
Fail("SetEvent m_hHaveRelaseEvent Error ") ;
};
}
pSendBuffer = pBuffer ;
iRetCode = 0 ;
m_lsSendBufferList.UnLockList();
}
catch (...)
{
m_lsSendBufferList.UnLockList();
}
}
iRetCode = 0 ;
MYEXCEPTIONFUNC_END("NWSendThread::GetOneBuffer()");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -