VC SOCKET 多线程
我在调试一个TCP服务器,用的是多线程方法,每一个线程负责处理一个SOCKET来的数据,并且处理方式是一样的,但在调试时发现,线程之间相互干扰,例如,第一个SOCKET来的数据,本来应该进入第一个线程处理,但是它实际进入的是第二个线程。下面的是我写的程序,请帮忙看看。
//每来一个连接就开启一个线程
void CServerSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CServerSocket* m_pNewSocket = new CServerSocket(pMainWnd); //创建新的SOCKET
// BOOL a = 1;
// setsockopt(m_pNewSocket->m_hSocket , IPPROTO_TCP , TCP_NODELAY , (char*)&a , sizeof(a));
((CTCPHelperDlg*)pMainWnd)->m_pServersocket->Accept(*m_pNewSocket);
m_pNewSocket->InitQueue(m_pNewSocket->m_ProcessDataQueue , sizeof(m_pNewSocket->m_ProcessDataQueue));
m_pNewSocket->m_hProcessEvent[END_PROCESS_THREAD_INDEX] = CreateEvent(NULL , FALSE , FALSE , _T("EndProcessData"));
m_pNewSocket->m_hProcessEvent[START_PROCESS_THREAD_INDEX] = CreateEvent(NULL , FALSE , FALSE , _T("StartProcessData"));
AfxBeginThread(ProcessDataThread , m_pNewSocke); //开启线程
m_pNewSocket->m_hProcessThread = CreateEvent(NULL , FALSE , FALSE , NULL); //判断线程关闭的HANDLE
((CTCPHelperDlg*)pMainWnd)->SendMessage(WM_TCP_ACCPET , (WPARAM)m_pNewSocket , 0);
CAsyncSocket::OnAccept(nErrorCode);
}
void CServerSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
/* assert(NULL != pMainWnd);*/
if (nErrorCode == 0)
{
RcvLen = this->Receive(RcvBuf , sizeof(RcvBuf)); //接收SOCKET数据
WriteDataToQueue(RcvBuf , RcvLen); //每来一次数据就将数据全部写入队列中
SetEvent(m_hProcessEvent[START_PROCESS_THREAD_INDEX]);//然后置位相应的HANDLE,使其进入对应的线程中处理
//发送接收消息给主线程
POSITION m_SocketPos = ((CTCPHelperDlg*)pMainWnd)->FindSocketFromList(this);
if (m_SocketPos != NULL)
{
((CTCPHelperDlg*)pMainWnd)->SendMessage(WM_TCP_RX, (WPARAM)m_SocketPos , (LPARAM)RcvLen);
}
}
CAsyncSocket::OnReceive(nErrorCode);
}
//这是线程的处理函数
UINT CServerSocket::ProcessDataThread(LPVOID param)
{
CServerSocket* pTmpServerSocket = (CServerSocket*)param;
int WaitIndex;
pTmpServerSocket->m_bProcessThreadAlive = TRUE;
while(1)
{
WaitIndex = WaitForMultipleObjects(2 , pTmpServerSocket->m_hProcessEvent , FALSE , INFINITE);
if (WaitIndex == 0)
{
pTmpServerSocket->m_bProcessThreadAlive = FALSE;
SetEvent(pTmpServerSocket->m_hProcessThread);
return 0;
}
else
{
pTmpServerSocket->ProcessDataFrame(pTmpServerSocket->pMainWnd);
}
}
return 0;
}
请高手帮忙找一下问题,谢谢!