VC++编程在线程中创建Sockets不响应消息问题
在工作中,我需要从CWinThread派生一个界面线程类,专门处理有关Windows套接字的一些相关操作,比如建立、连接、收发、关闭等。程序写完后,发现生成的CAsyncSocket实例不响应连接、接收等消息,百思不得其解。经过仔细跟踪调试,发现原来是我把CAsyncSocket实例过程写在了线程的InitInstance()函数里,而我又在此函数里进行循环等待事件,永远不从此函数返回,除非是要退出线程的时候才返回。见下面的错误代码:
BOOL CMyThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
//创建属于线程的SOCKET*
InitSocketAndBuf();
HANDLE hEvents[3];
hEvents[0] = m_hReConnectEvent; //连接事件
SetEvent(hEvents[0]);//首先进行连接
hEvents[1] = m_hRecvEvent; //接收报文事件
ResetEvent(hEvents[1]);
hEvents[2] = m_hSendEvent; //发送报文事件
ResetEvent(hEvents[2]);
while (1)
{
DWORD dwWait = WaitForMultipleObjects(3,hEvents,FALSE,INFINITE);
if (pApp->m_bExitFlag) break;
switch (dwWait)
{
case WAIT_OBJECT_0:
ReConnectDevice();
ResetEvent(hEvents[0]);
break;
case WAIT_OBJECT_0+1:
ResetEvent(hEvents[1]);
break;
case WAIT_OBJECT_0+2:
ResetEvent(hEvents[2]);
break;
default:
break;
}
}
return FALSE;
}
InitSocketAndBuf()函数就是我实例化Sockets的过程。如果不从此InitInstance()函数返回true,系统控制权尚未交还,就不会继续运行线程的消息循环,因此阻塞了消息传递,所以Sockets的响应消息也就没有了,问题查到。
解决办法如下:
继续阅读…
发表评论 2008年02月20日 星期三 zmouse 1375次阅读