代码如下:
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没任何关系啊。
解决方案 »
- 一个连接SQLSERVER数据库的问题!!急求解答,感激!!
- 请教一个关于编辑框显示的问题
- SDI程序中,我将框架的WS_CAPTION风格,菜单,状态栏,工具栏都去掉,可显示的窗口还是有个边框,如何把这个边框去掉?
- 为什么我的程序不稳定?
- 问是否有mkdir的相关函数
- 我有一个程序能成功的实现单实例运行,但是在第二个程序运行的时候不能使第一个应用程序的窗体成功的setforegroundwindow,有兴趣要的留
- 五子棋的人工智能该怎样实现?????
- 再开一贴,关于视频插件点击事件
- 软件测试员搞点什么?
- GetFileName()得到的文件名,怎样把扩展名分离出来?
- 数据库更新语句无法执行
- 大家学VC++都看过那些经典书,买了什么书?
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).
例如:你上面创建的事件对象句柄值保存在m_recvEvent 中,而WaitForSingleObject所等待的事件参数却为hEvent....不知是不是手误?
中的hEvent是人工重置事件,如果处于通知状态
则等待成功不会产生副作用,所有事件还是处于通知状态,循环一直进行