CIOCPServer类中的StopServer将m_hKillEvent置位,然后用WaitForSingleObject等待m_hAcceptThread退出
m_hAcceptThread为一线程,用来接收网络连接现在的问题是,只要WaitForSingleObject,主线程就挂住4秒,而这段时间AcceptThread也什么动作都不做了,奇怪
void CIOCPServer::StopServer()
{
SendDebugMessage ( "StopServer发送退出事件", "CIOCPServer::StopServer", DL_LEVEL_4, DZ_CLASS_CIOCPServer);
SetEvent(m_hKillEvent);
SendDebugMessage ( "等待AcceptThread退出", "CIOCPServer::StopServer", DL_LEVEL_4, DZ_CLASS_CIOCPServer);
if ( WaitForSingleObject ( m_hAcceptThread, 4000 ) == WAIT_TIMEOUT )
{
SendDebugMessage ( "等待超时,强制终止AcceptThread", "CIOCPServer::StopServer", DL_LEVEL_2, DZ_CLASS_CIOCPServer);
if ( !TerminateThread ( m_hAcceptThread, 0 ) )
SendDebugMessage ( "强制终止AcceptThread失败", "CIOCPServer::StopServer", DL_LEVEL_2, DZ_CLASS_CIOCPServer); }
SendDebugMessage ( "StopServer执行成功", "CIOCPServer::StopServer", DL_LEVEL_4, DZ_CLASS_CIOCPServer);}
下面是AcceptThread的代码(删节了不少内容,多余的都删掉了,但是仍然运行不正常)unsigned CIOCPServer::AcceptThreadProc(LPVOID lParam)
{
CIOCPServer* pThis = reinterpret_cast<CIOCPServer*>(lParam); WSANETWORKEVENTS events;
SendDebugMessage ( "开始AcceptThread", "CIOCPServer::AcceptThread", DL_LEVEL_2, DZ_CLASS_CIOCPServer);
while(1)
{
DWORD dwRet;
        SendDebugMessage ( "尝试接收退出事件", "CIOCPServer::AcceptThread", DL_DETAL, DZ_CLASS_CIOCPServer);
if (WaitForSingleObject(pThis->m_hKillEvent, 0) == WAIT_OBJECT_0)
{
SendDebugMessage ( "接收到退出事件", "CIOCPServer::AcceptThread", DL_LEVEL_3, DZ_CLASS_CIOCPServer);
break;
} dwRet = WSAWaitForMultipleEvents(1,
 &pThis->m_hEvent,
 FALSE,
 500,
 FALSE); if (dwRet == WSA_WAIT_TIMEOUT)
continue; //
// Figure out what happened
//
int nRet = WSAEnumNetworkEvents(pThis->m_sListenSocket,
 pThis->m_hEvent,
 &events);

if (nRet == SOCKET_ERROR)
{
SendDebugMessage ( "ListenSocket发生网络错误", "CIOCPServer::AcceptThread", DL_SYSTEM, DZ_CLASS_CIOCPServer, WSAGetLastError());
break;
} // Handle Network events //
// ACCEPT
if (events.lNetworkEvents & FD_ACCEPT)
{
if (events.iErrorCode[FD_ACCEPT_BIT] == 0);
//pThis->OnAccept();
else
{
SendDebugMessage ( "ListenSocket发生未知的网络事件", "CIOCPServer::AcceptThread", DL_SYSTEM, DZ_CLASS_CIOCPServer, WSAGetLastError());
break;
} } } // while....
SendDebugMessage ( "退出AcceptThread", "CIOCPServer::AcceptThread", DL_LEVEL_2, DZ_CLASS_CIOCPServer); return 0; // Normal Thread Exit Code...
}AcceptThread的循环每次都Wait m_hKillEvent,但是主线程wait它以后AcceptThread就挂起了
未置位m_hKillEvent的时候每500ms会有一个Debug Message
但是WaitForSingleObject的4秒钟里,没有任何一个Debug Message发出,可以确定AcceptThread挂住了Debug输出信息:
[07/16/03 18:56:13]  <CFBBServerApp::InitInstance> 系统开始执行
[07/16/03 18:56:13]  <CIOCPServer::CIOCPServer> IOCPServer构造
[07/16/03 18:56:13]  <CIOCPServer::AcceptThread> 开始AcceptThread
[07/16/03 18:56:13]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:14]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:14]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:15]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:15]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:16]  <CIOCPServer::AcceptThread> 尝试接收退出事件
[07/16/03 18:56:16]  <CIOCPServer::StopServer> StopServer发送退出事件
[07/16/03 18:56:16]  <CIOCPServer::StopServer> 等待AcceptThread退出
[07/16/03 18:56:20]  <CIOCPServer::StopServer> 等待超时,强制终止AcceptThread
[07/16/03 18:56:20]  <CIOCPServer::StopServer> StopServer执行成功
请大家帮偶看看,到底是什么问题,难道偶对线程理解有问题?@@