//监视线程实现函数
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百分,多给大家点:)
解决方案 »
- 学生求帮助!MFC 重载了CStatic类想动态画很多图,总是会清空前一幅图!
- VC6.0基于对话框的编辑TXT的程序(急等高手帮忙)
- 100分---关于实现单用户登录的一些想法
- vc中采用ado技术进行数据库操作,用数据库跟踪,该语句已经执行了,但是却没有查询到数据,而将数据库跟踪中的执行的语句copy放进sql查询分析器却是有结果的。
- 如何产生悬停帮助
- 请问在MDI程序中如何在CMainFrame获取到文档和View类指针
- 一个打击学习VC信心的难题-视图切换中的问题
- 请问:在程序中用代码如何实现导出整个注册表?
- 如何在onButton()事件里调用函数OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
- 如何让CEdit中的文本自动调整行宽换行?
- ID号为ID_EDIT_COPY的菜单具有复制功能吗?
- 提问:listctrl的item如何与具体的数据对应起来?
1.这是代码摘录,删除并修改过的代码片段
2.为了防止错误而做的处理(这个有点说不过去,很明显不可能一个while内部使用continue
3.某些作者为说明应用示例写的代码,只保证结构,并不保证代码细节
while(!GetOverlappedResult (dlg.hCom,&OverLapped,&dwBytesRead,TRUE))
{
if(ERROR_IO_INCOMPLETE==GetLastError())
continue;
}感觉这里还是换成WaitForSingleObject(OverLapped.hEvent,2000);这个好,即等待又有超时作用了???
{
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 );
}}
{
abContinue = FALSE;
break;
} abContinue=FALSE;执行这一条后不是退出线程了么?还以后就没监视作用了有空希望再讲解下呵呵!