void __cdecl CIocpSock::MyProc(void * pParam)
{
CIocpSock * pthis = (CIocpSock *)pParam;
HANDLE hCompletionPort = pthis->m_hCompletionPort;
ULONG_PTR nIndex;
OVERLAP_PLUS * pOverlapPlus;
DWORD nSize;
LPOVERLAPPED pOverlapped;
BOOL succeed;
for (;;)
{
pOverlapped = NULL;
nIndex = int(pthis->m_nClient); succeed = ::GetQueuedCompletionStatus(hCompletionPort,
&nSize, &nIndex, &pOverlapped, INFINITE); if (size_t(nIndex) >= pthis->m_nClient)
{
//这里确定线程已经退出
break;
}
pOverlapPlus = (OVERLAP_PLUS *)pOverlapped; if (succeed)
{
if (pOverlapPlus)
{
switch (pOverlapPlus->nType)
{
case IO_WRITE:
pthis->OnWrite(nIndex, nSize);
break;
case IO_READ:
pthis->OnRead(nIndex, nSize);
break;
case IO_INIT:
pthis->OnInit(nIndex, nSize);
break;
}
}
}
else
{
pthis->Close(nIndex);
} if (pOverlapPlus)
{
DeleteOverlapPlus(pOverlapPlus);
}
}
}
bool CIocpSock::Shutdown()
{
size_t i; for (i=0; i<m_nThread; i++)
{
::PostQueuedCompletionStatus(m_hCompletionPort,
0, (DWORD)m_nClient, NULL);
} for (i=0; i<m_nThread; i++)
{
if (m_hThreads[i] != NULL)
{
::WaitForSingleObject(m_hThreads[i], INFINITE);
m_hThreads[i] = NULL;
}
} if (m_hCompletionPort)
{
::CloseHandle(m_hCompletionPort);
m_hCompletionPort = NULL;
} return true;
}多个线程的时候,发现,线程函数已经break了,但是WaitForSingleObject有时很正常,有时还是会阻塞,比如开6个线程,在第3个WaitForSingleObject时阻塞住,但是线程函数已经break 6次了。我用的是win7 64位系统,vs2010,请大家指点迷津,多谢多线程TCP/IP完成端口
解决方案 »
- 我用skin++做程序皮肤时,发现datagrid控件窗口滑块不能正常移动???
- 控件调用应用程序的问题
- ADO访问access的问题
- SDI程序框架类中取得视图类指针后,发现hWnd=???的错误.再线请教
- 关于库的一个问题
- char WriteNum[80] = "F0F0F0" 如何转化成 unsigned char szTemp[80] = {0xF0, 0xF0, 0xF0}呢?
- 用VC自己编程实现菜单,但功底不够,请老大们看看好不?(在线等啊!急了!傻了!)
- 自己绘制的控件怎么控制?
- 串口通信 vc labview 难
- 线程中调用Updatedata的问题
- AddFontResourceEx : is not a member of '`global namespace'
- 【菜鸟求指导】MFC中如何实现任意选择和改变画笔样式、宽度和颜色?
{
if (m_hThreads[i] != NULL)
{
::WaitForSingleObject(m_hThreads[i], INFINITE);
m_hThreads[i] = NULL;
}
}
放到另外的线程里做,而且这个线程得比下面的这几段先运行。有可能是线程m_hThreads[i]结束后才用WaitForSingleObject导致无效了
for (i=0; i<m_nThread; i++)
{
::PostQueuedCompletionStatus(m_hCompletionPort,
0, (DWORD)m_nClient, NULL);
}