WSAWaitForMultipleEvents应用疑问
WSAWaitForMultipleEvents使用疑问
下面的这个函数是一个WSAEventSelect模型的服务线程,多线程实现。这里作者使用了两个WSAWaitForMultipleEvents对事件对象数组进行检查网络事件。我怎么没看明白,是不是for()循环那个WSAWaitForMultipleEvents是不需要的?作者的用意是什么?给看看?
------解决方案--------------------
应该有是用的.
有什么用呢?
要看程序上下文.
这些个事件对象都是在哪个SOCKET里?
------解决方案--------------------
可能它不是在等单一的事件.
这个前面的事件只是开始的信号.
后面的才是真正感兴趣的.
------解决方案--------------------
第一个WSAWaitForMultipleEvents是等待事件对象Signal,如果同时有多个事件对象受信,WSAWaitForMultipleEvents函数的返回值也只能指明其中的一个,就事件句柄数组中最前面的那个。如果这个指明的事件对象总有网络事件发生,那么后面的其他事件对象所关联的网恋过事件就得不到及时的处理。因此WSAWaitForMultipleEvents函数返回以后,对每个事件对象再次调用WSAWaitForMultipleEvents函数,以确定其状态。
------解决方案--------------------
没错,楼上正解。
------解决方案--------------------
我也是才刚起步学习...
头晕
------解决方案--------------------
如5楼所说
你可以百度一下WaitForMultipleObjects
其中有
多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。
这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将得不到被处理的机会。
为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。
下面的这个函数是一个WSAEventSelect模型的服务线程,多线程实现。这里作者使用了两个WSAWaitForMultipleEvents对事件对象数组进行检查网络事件。我怎么没看明白,是不是for()循环那个WSAWaitForMultipleEvents是不需要的?作者的用意是什么?给看看?
//处理I/O的线程
DWORD WINAPI ServerThread(LPVOID lpParam)
{
pTHREAD_OBJ pThread=(pTHREAD_OBJ)lpParam;
printf("新线程%d起动\n",GetCurrentThreadId());
while(true)
{
//等待网络事件
int nIndex=WSAWaitForMultipleEvents(pThread->nSocketCount+1,pThread->hEvents,false,WSA_INFINITE,false);
nIndex=nIndex-WSA_WAIT_EVENT_0;
//查看受信事件
for(int i=nIndex;i<pThread->nSocketCount+1;i++)
{
nIndex=WSAWaitForMultipleEvents(1,&pThread->hEvents[i],true,0,false);
if(WSA_WAIT_FAILED==nIndex||WSA_WAIT_TIMEOUT==nIndex)
{
continue;
}
else
{
if(0==i)
{
RebuildArray(pThread); // 重建句柄数组
if(pThread->nSocketCount==0)
{
FreeThreadObj(pThread);
printf("线程%d退出\n",GetCurrentThreadId());
return 0;
}
::WSAResetEvent(pThread->hEvents[0]);
}
else
{
pSOCKET_OBJ pSocket=FindSocketObj(pThread,i);
if(pSocket!=NULL)
{
if(!HandleIO(pThread,pSocket))
{
RebuildArray(pThread); // 重建句柄数组
}
}
else
{
printf("unable to find socket object\n");
}
}
}
}
}
}
------解决方案--------------------
应该有是用的.
有什么用呢?
要看程序上下文.
这些个事件对象都是在哪个SOCKET里?
------解决方案--------------------
可能它不是在等单一的事件.
这个前面的事件只是开始的信号.
后面的才是真正感兴趣的.
------解决方案--------------------
第一个WSAWaitForMultipleEvents是等待事件对象Signal,如果同时有多个事件对象受信,WSAWaitForMultipleEvents函数的返回值也只能指明其中的一个,就事件句柄数组中最前面的那个。如果这个指明的事件对象总有网络事件发生,那么后面的其他事件对象所关联的网恋过事件就得不到及时的处理。因此WSAWaitForMultipleEvents函数返回以后,对每个事件对象再次调用WSAWaitForMultipleEvents函数,以确定其状态。
------解决方案--------------------
没错,楼上正解。
------解决方案--------------------
我也是才刚起步学习...
头晕
------解决方案--------------------
如5楼所说
你可以百度一下WaitForMultipleObjects
其中有
多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。
这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将得不到被处理的机会。
为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。