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百分,多给大家点:)
...全文
124 14 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
恩,确实是这样。
摘要: 微软Win32下的串口通讯完全不同于Windows下16位的串口通讯,那些熟悉16位下串口通讯功能的将不得不去适当的重新学习许多Win32下串口通讯的系统部分,这篇文章将会帮助你完成这些。对串口通讯不熟悉的那些人通过这篇文章的学习将会为自己以后的研究发展奠定坚实的基础。 这篇文章主要以读者熟悉的多线程和Win32下的并行操作为例。除此之外,基于对Win 32堆栈功能的熟悉了解在理解内存管理机制中是非常有用的,比如这篇文章所提到的MTTTY。对于较多关于这些功能的信息,商议平台 SDK 文件的编写,微软公司Win32 SDK 知识 库 , 或微软公司网络开发者程序馆。那些控制用户接口和会话视窗的功能界面(APIs)尽管在这里并不做讨论,但是对于完全了解此篇文章提供的例子是非常有用的。对于不熟悉一般微软视窗操作系统的应该在学习串口通讯之前学习一些基本的微软程序设计。换句话说,在潜水之前先沾湿你的脚。 绪论: 这篇文章的焦点主要是应用程序设计界面(API)和微软公司兼容的方法上,Windows NT 和 Windows 95;因此,API在两个平台上的支持是唯一的探讨。Windows 95 支持 Win32,电话API(TAPI)和Windows NT 3.x不支持;因此,这里我们不讨论TAPI 。然而,TAPI 确实值得一提,它在调制解调器接口和呼叫控制中的应用是非常有用的。一个用调制解调器工作和电话程序应该实现这些TAPI 功能界面。这将允许用另一个TAPI应用程序接口与之紧密结合。此外,这篇文章不讨论Win32下象GetCommProperties的一些配置功能。 这篇文章从如下几段入手:打开串口、读写操作(非重叠重叠)、串口状态(事件和错误)和串口设置(DCB,流量控制和通信超时)。 这篇文章所包含的例子MTTTY:多线程TTY诸多功能实现的讨论。它使用了三个线程来实现:一个内存管理用户界面的线程,一个控制所有写操作的线程,一个控制读和改变串口状态的线程。这个例子中的内存管理使用了一些不同的数据堆。它也广泛的利用同步方法促进线程间的通信。 ..................... ....................

16,466

社区成员

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

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

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