OVERLAPPED os;
DWORD dwMask,dwTrans;
dwMask=0; COMSTAT ComStat;
DWORD dwErrorFlags; CTestComDlg *pdlg=(CTestComDlg*)pParam; int ReTemp; memset(&os,0,sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event lbjectQ");
return 0;
} while(pdlg->m_bConnected)
{
//::InterlockedIncrement((long *)&TermEnd);
if (::WaitForSingleObject(eventkill,0)==WAIT_OBJECT_0)
{
break;
}

//用两种方法判断是否有字符,一是字符数大于0,二是有字符事件 //字符数大于0
ClearCommError(pdlg->m_hCom,&dwErrorFlags,&ComStat);
if(ComStat.cbInQue>0)
{
WaitForSingleObject(pdlg->m_hPostMsgEvent,INFINITE);
ResetEvent(pdlg->m_hPostMsgEvent);
ReTemp=pdlg->ThreadReadCom(EV_RXCHAR,0);

ReLenght+=ReTemp;
//1为命令包的长度
if (ReLenght>=1)
{
CloseHandle(os.hEvent);
return 0;
}
} //字符事件
dwMask=0;
if(!WaitCommEvent(pdlg->m_hCom,&dwMask,&os))
{
//pdlg->ProcessErrorMessage("串口事件");
if(GetLastError()==ERROR_IO_PENDING)
{
     GetOverlappedResult(pdlg->m_hCom,&os,&dwTrans,TRUE);
}
} }
CloseHandle(os.hEvent);
         return 0;
我在主线程,开了上面的这个线程,当第一次用执行是GetLastError()得到ERROR_IO_PENDING,可当这个线程超时我用事件对象eventkill终止线程后,再重新建这个线程,GetLastError()得到ERROR_INVALID_PARAMETER,以后再新建去向都是这样,而如用TerminateThread(m_pThread->m_hThread,0);来终止线止,就不这样每次就是得ERROR_IO_PENDING,请问什么?是不是有什么变量我没放?TerminateThread是怎么做的,能使GetLastError()得ERROR_IO_PENDING,而事件对象则不行!终止线程不是最好不用TerminateThread吗?

解决方案 »

  1.   

    ClearCommError(m_hFile,&dwErrorFlags,&ComStat ) ;
    if (!SetCommMask(m_hFile, dwEvtMask))
    {
    //////////...........
    }
    WaitCommEvent(m_hFile, &dwEvtMask, &m_osXXXX);记得在WaitCommEvent前加上SetCommMask.
      

  2.   

    请不要一帖多发
    我在http://community.csdn.net/Expert/topic/4390/4390101.xml回复了你的问题
      

  3.   

    jiangsheng(蒋晟.MSMVP2004Jan) ( ):好的老大.
    DentistryDoctor(My heart will fly,in the sky.) ( ):兄弟,我在设置串口参数的时间已经SetCommMask.是这样用的SetCommMask(m_hCom,EV_RXCHAR);难道我在线程中WaitCommEvent,每次在它之前都要SetCommMask吗?为什么要这样呀!为什么我用TerminateThread终止线程就好了.
      

  4.   

    ClearCommError后得调SetCommMask才能WaitCommEvent.
      

  5.   

    DentistryDoctor(My heart will fly,in the sky.) ( ) :老兄,我在
    打开串口时先ClearCommError,后得调SetCommMask(m_hCom,EV_RXCHAR);但这些操作我只做了一次,然后就开了做了一个循环在其中开了一个线程,在线程用的WaitCommEvent,同时设置了线程超时,如超时了,就终止线程,在重新开,这样的.
       您的意思是不是,在线程中,我每WaitCommEvent,之前都要SetCommMask,您看我的代码,在WaitCommEvent前我已经ClearCommError就是没有再SetCommMask,您的意思是不是差在这呀!
    谢谢!
      

  6.   


     回复人: DentistryDoctor(My heart will fly,in the sky.) ( ) :我试了您说的,您是对的,能给我解释一下吗?为什么每次WaitCommEvent.前都要SetCommMask吗?SetCommMask只做一次不可能吗?这些为什么?