//监视线程实现函数
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百分,多给大家点:)

解决方案 »

  1.   

    这样的代码出现有几种可能性:
    1.这是代码摘录,删除并修改过的代码片段
    2.为了防止错误而做的处理(这个有点说不过去,很明显不可能一个while内部使用continue
    3.某些作者为说明应用示例写的代码,只保证结构,并不保证代码细节
      

  2.   


    while(!GetOverlappedResult   (dlg.hCom,&OverLapped,&dwBytesRead,TRUE))
                            {
                                if(ERROR_IO_INCOMPLETE==GetLastError())  
                                continue;
                            }感觉这里还是换成WaitForSingleObject(OverLapped.hEvent,2000);这个好,即等待又有超时作用了???
      

  3.   

    里面那层循环没必要了,WaitCommEvent(dlg.hCom,&dwEventMask,&OverLapped);有数据才会返回,下面的读操作应该不会产生ERROR_IO_PENDING错误,数据你判断接收完全后发消息通知主线程进行处理就可以了
      

  4.   

    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 );
    }}
      

  5.   

    楼上大哥谢谢你,可是我看不大明白。代码上面部分干嘛要判断发送数据完毕?还有if (!abRet ) 

      abContinue = FALSE; 
      break; 
    } abContinue=FALSE;执行这一条后不是退出线程了么?还以后就没监视作用了有空希望再讲解下呵呵!