+ -
当前位置:首页 → 问答吧 → WaitForSingleObject等待事件对象的问题

WaitForSingleObject等待事件对象的问题

时间:2011-12-03

来源:互联网

代码如下:
m_recvEvent = CreateEvent(NULL,true,true,"同步接收的事件对象"); //人工重置,有信号

while(WAIT_OBJECT_0 == WaitForSingleObject(hEvent,0))
{

  ret = recvfrom(sockstr.sock,sockstr.buf,This->m_length,0,(sockaddr*)&serAddr,&fromelen);
}

没有任何地方用ReSetEvent();为什么这段代码却不会无限循环呢,而是运行了4次(在recvfrom接收不到信息的情况下);
WaitForSingleObject(hEvent)和recvfrom没任何关系啊。

作者: najiutan   发布时间: 2011-12-03

自己断点调试一下

作者: oyljerry   发布时间: 2011-12-03

引用 1 楼 oyljerry 的回复:
自己断点调试一下

我断点都把程序断的不行了,如下:
C/C++ code
    while(WAIT_OBJECT_0 == WaitForSingleObject(dmUDP->m_hSearchEvent, 0)) //指定的对象为有信号状态,这里确实为有信号状态,直接往下执行
    {
        DWORD dwRet = WaitForSingleObject(dmUDP->m_hSearchEvent, 0);
        if (WAIT_TIMEOUT==dwRet)
        {
            TRACE("*************等待事件对象超时**********\n");
        }
        else if (WAIT_ABANDONED == dwRet)
        {
            TRACE("***************没等到**************\n");
        }
        else if (WAIT_OBJECT_0 == dwRet)
        {
            TRACE("*********等到了**********");
        }
        TRACE("*******进入了while*************\n");
        retval = recvfrom(dmUDP->m_searchSock, buf, sizeof(buf), 0, (struct sockaddr *)&from_addr, &sin_size);     
        // 分解包
        if(retval>0)
        {
            TRACE("******接收到了数据%s%d***************\n",buf,retval);
            CString str;
            str.Format("%s",buf);
            AfxMessageBox(str);
            memset(szContent,'\0',sizeof(szContent));
            dmUDP->m_pProtPackParser->Parser(buf, retval, &sCmdCod, &sSubCmdCod, &sProtVer, szContent);    //buf为需要转换的内容,retval内容的长度,sCmdCod为命令码    
            
            if(strlen(szContent)<=0) 
            {
                continue;
            }
            
            // 回调
            dmUDP->m_pSearchRecv(szContent,strlen(szContent));   
    }
        else
        {
            TRACE("**********sleep1*******************");
            Sleep(100);
            TRACE("**sleep2*************");
        }
    }
    TRACE("*********跳出了while**************");
    closesocket(dmUDP->m_searchSock);
    return(1);



在没有设备的时候,调试得到的结果:
Loaded 'C:\WINDOWS\system32\wshtcpip.dll', no matching symbolic information found.
**********************等到了*******************************************进入了while*****************************************
******************************接收到了数据4*********************
**********************等到了*******************************************进入了while*****************************************
******************************接收到了数据4*********************
**********************等到了*******************************************进入了while*****************************************
******************************接收到了数据4*********************
**********************等到了*******************************************进入了while*****************************************
The thread 0x80C has exited with code 2 (0x2).
The thread 0xE38 has exited with code 2 (0x2).

作者: najiutan   发布时间: 2011-12-03

recvfrom是阻塞式的吧?都阻塞在那里了,怎么再运行下一个循环呢?

作者: flydreamGG   发布时间: 2011-12-04

引用 2 楼 najiutan 的回复:
引用 1 楼 oyljerry 的回复:
自己断点调试一下

我断点都把程序断的不行了,如下:

C/C++ code
while(WAIT_OBJECT_0 == WaitForSingleObject(dmUDP->m_hSearchEvent, 0)) //指定的对象为有信号状态,这里确实为有信号状态,直接往下执行
{
DWORD dwRet ……

没看到 跳出了while,,直接退出了?

作者: oyljerry   发布时间: 2011-12-04