VC SOCKET 多线程

wangzelu1988 2012-07-19 07:13:01
我在调试一个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;
}

请高手帮忙找一下问题,谢谢!
...全文
188 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangzelu1988 2012-07-25
  • 打赏
  • 举报
回复
谢谢,我的问题已经解决了,是由于创建
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"));
这两个HANDLE时,重名了,因为我每一个SOCKET都建立这两个HANDLE,所以才会出现上述问题。
昨夜无风 2012-07-19
  • 打赏
  • 举报
回复
多用几个m_hProcessEvent 来分别。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧