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没任何关系啊。
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 ……
引用 1 楼 oyljerry 的回复:
自己断点调试一下
我断点都把程序断的不行了,如下:
C/C++ code
while(WAIT_OBJECT_0 == WaitForSingleObject(dmUDP->m_hSearchEvent, 0)) //指定的对象为有信号状态,这里确实为有信号状态,直接往下执行
{
DWORD dwRet ……
没看到 跳出了while,,直接退出了?
作者: oyljerry 发布时间: 2011-12-04
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28