API重叠方式通讯!

godzhwei 2008-07-31 04:38:37

//监视线程实现函数
DWORD ThreadProc(LPVOID lpParameter)
{
OVERLAPPED OverLapped;
memset(&OverLapped,0,sizeof(OVERLAPPED));
DWORD dwEventMask=0;
CZhc618Dlg dlg;
while (dlg.m_bThreadFlag)
{
WaitCommEvent(dlg.hCom,&dwEventMask,&OverLapped);
if ((dwEventMask&EV_RXCHAR)==EV_RXCHAR)
{
COMSTAT Comstat;
DWORD dwBytesRead;
DWORD dwCommError;
unsigned char pData[1024];
memset(pData,0,1024);
ClearCommError(dlg.hCom,&dwCommError,&Comstat);
if (Comstat.cbInQue>0)
{
if (!(ReadFile(dlg.hCom,pData,Comstat.cbInQue,&dwBytesRead,&OverLapped)))
{
if (ERROR_IO_PENDING==GetLastError())
{
while(!GetOverlappedResult (dlg.hCom,&OverLapped,&dwBytesRead,TRUE))
{
if(ERROR_IO_INCOMPLETE==GetLastError())
continue;
}
}
}
//通知主线程进行数据处理...
}
}
}
return 0;
}

上面代码是从网上摘了一点组合起来的。大家帮我看看是不是问题很多咯?希望大家多多指点了!在上面代码中,当我接收完数据就发消息给主线程处理,这条语句应该写在哪个位置?

if(ERROR_IO_INCOMPLETE==GetLastError())
continue;
这两句代码我感觉有点多余,是不是应该换成超时退出的代码?

当数据还没接收完的话GetOverlappedResult会一直阻塞吧,那上面的while循环也可以不要啊,感觉没作用啊。。。
大家多多关注先谢谢了,刚押宝游戏赚了3百分,多给大家点:)
...全文
127 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
godzhwei 2008-08-08
  • 打赏
  • 举报
回复
楼上大哥谢谢你,可是我看不大明白。代码上面部分干嘛要判断发送数据完毕?还有

if (!abRet )
{
abContinue = FALSE;
break;
}

abContinue=FALSE;执行这一条后不是退出线程了么?还以后就没监视作用了。。。有空希望再讲解下呵呵!
贪玩的老鼠 2008-08-06
  • 打赏
  • 举报
回复
DWORD ThreadProc(LPVOID lpParameter)
{
OVERLAPPED OverLapped;
memset(&OverLapped,0,sizeof(OVERLAPPED));
DWORD dwEventMask=0;
bool abContinue = true;
CZhc618Dlg *pdlg=(CZhc618Dlg*)lpParameter;//这里设置没有用 从lpParameter(以指针方式带过来
while (pdlg->m_bThreadFlag&&abContinue)
{
BOOL abRet = ::WaitCommEvent(pdlg->hCom,&dwEventMask,&OverLapped);
if ( !abRet )
{
ASSERT( GetLastError () == ERROR_IO_PENDING);
}
::WaitForSingleObject(OverLapped.hEvent,INFINITE);//如果有监控WaitForMultipleObjects
DWORD dwMask;
if (GetCommMask(pdlg->hCom,&dwMask) )
{
if ( dwMask == EV_TXEMPTY )
{
AfxMessageBox("Data sent");
ResetEvent ( ov.hEvent );
continue;
}

}
try
{
BOOL abRet = false;
DWORD dwBytesRead = 0;
OVERLAPPED ovRead;
memset(&ovRead,0,sizeof(ovRead));
ovRead.hEvent = CreateEvent( 0,true,0,0);
do
{
ResetEvent( ovRead.hEvent );
char szTmp[64];
memset(szTmp,0,64);
abRet = ::ReadFile(pdlg->hCom,szTmp,64,&dwBytesRead,&ovRead);
if (!abRet )
{
abContinue = FALSE;
break;
}
if ( dwBytesRead > 0 )
{
//自己处理
}

}while (dwBytesRead);//每次读取64个字节

CloseHandle(ovRead.hEvent );
}
catch(...)
{
ASSERT(0);
}

//通知已经读取了数据
ResetEvent ( OverLapped.hEvent );
}

}
5411208 2008-08-05
  • 打赏
  • 举报
回复

学习,帮顶。
godzhwei 2008-08-05
  • 打赏
  • 举报
回复
无满意答案哦。。。不好结帖啊!!!
kmarshal 2008-08-01
  • 打赏
  • 举报
回复
里面那层循环没必要了,WaitCommEvent(dlg.hCom,&dwEventMask,&OverLapped);有数据才会返回,下面的读操作应该不会产生ERROR_IO_PENDING错误,数据你判断接收完全后发消息通知主线程进行处理就可以了
godzhwei 2008-08-01
  • 打赏
  • 举报
回复
...楼上你遇到过应该解决了,让我分享下啊!
godzhwei 2008-08-01
  • 打赏
  • 举报
回复

while(!GetOverlappedResult (dlg.hCom,&OverLapped,&dwBytesRead,TRUE))
{
if(ERROR_IO_INCOMPLETE==GetLastError())
continue;
}



感觉这里还是换成WaitForSingleObject(OverLapped.hEvent,2000);这个好,即等待又有超时作用了???
godzhwei 2008-08-01
  • 打赏
  • 举报
回复
3楼能否贴点代码我看看?:)
godzhwei 2008-08-01
  • 打赏
  • 举报
回复
1楼高手,确实是这样是怎样?请问代码哪些地方还有问题?通知主线程处理数据的语句应该放哪个位置??
godzhwei 2008-08-01
  • 打赏
  • 举报
回复

人呢?来帮帮忙撒!
僵哥 2008-07-31
  • 打赏
  • 举报
回复
这样的代码出现有几种可能性:
1.这是代码摘录,删除并修改过的代码片段
2.为了防止错误而做的处理(这个有点说不过去,很明显不可能一个while内部使用continue
3.某些作者为说明应用示例写的代码,只保证结构,并不保证代码细节
9527他大爷 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoujianhei 的回复:]
恩,确实是这样。

[/Quote]
zhoujianhei 2008-07-31
  • 打赏
  • 举报
回复
恩,确实是这样。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧