我写一个串口通讯的程序, 用线程侦听接收字符的消息, 奇怪的是,我在DEBUG下运行一切正常, 在RELEASE下运行就会出错, 就是那种“‘0x6bc41351’指令引用的‘0x0000043c’内存。该内存不能为‘read’”的错。我将程序摆出来,各位大哥请帮忙!线程:
UINT CommProc(LPVOID pParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags; memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
} while(flag_thread)//打开线程
{
//memset(&ComStat, 0, sizeof(COMSTAT));
ClearCommError(cs.m_hIDComDev, &dwErrorFlags, &ComStat); if(ComStat.cbInQue)//如果串口缓冲仍有字节
{
if(ComStat.cbInQue < 3)
continue;
// 通知视图
PostMessage(pDlg, WM_FOUNDCHAR, 0, 0);
// 无限等待WM_COMMNOTIFY消息被处理完
WaitForSingleObject(m_hPostMsgEvent, INFINITE);
ResetEvent(m_hPostMsgEvent); continue;
} // 缓冲中没有数据了 dwMask=0; if(!WaitCommEvent(cs.m_hIDComDev, &dwMask, &os))  {
if(GetLastError() == ERROR_IO_PENDING) 
GetOverlappedResult(cs.m_hIDComDev, &os, &dwTrans, TRUE);
else {
CloseHandle(os.hEvent);
return (UINT)-1;
}
}
} CloseHandle(os.hEvent);
return 0;
}
发送到主界面的消息的处理函数:
void CDlg::OnReceiveChar()//线程发来消息的处理函数(收到字符消息)
{
char buffer[1200];
DWORD lenReceive; memset(buffer, 0x00, 1200);
lenReceive = cs.ReadData(buffer);
MessageBox(buffer);
SetEvent(m_hPostMsgEvent); //发生
}
其中cs是自己写的一个串口读写类,应该是没有问题。程序运行后,只要串口接收到字符,首先它可以正确读出来并MessageBox给我,紧接着就报错,这是怎么回事? 怎么DEBUG时就好好的?谢谢高手指点!

解决方案 »

  1.   

    PostMessage(pDlg, WM_FOUNDCHAR, 0, 0);//这边出错的线程触发事件就容易出问题我经常碰到这种问题,但也没找到什么办法。gz
      

  2.   

    用这个函数替换PostMessage
    ::SendMessage
      

  3.   

    MessageBox在整个VC中的级别比较高,所费过程较高。建议你用其它的控件,诸如listbox,直接将数据添加进去。
      

  4.   

    对,我也觉的问题在MessageBox,你可以用别的方法试试
      

  5.   

    谢谢大家!  问题还是没解决,急死了!我把所有的MessageBox都去掉了,不行。我又写了个Socket API的通讯程序,也是用的同一种方法——线程检测接收事件,结果和这个是一样的,报错!!郁闷!不过我发现,当第一次有数据发来缓冲,一切都正常,接收也正常,可是第二次有数据发来的时候,虽然也收到了,但随即马上报错,而且是连着报错三次!!(似乎第一次报错是主线程报错)谢谢大家!我一定高分报谢!!
      

  6.   

    我觉得你在串口数据来到,立刻在线程里读取数据,而不是放到消息函数去读取,会比较合适。
    因为POSTMESSAGE是可被堵塞的。
    或者象其他人说的,SENDMESSAGE可能会好点。
    既然,用了事件,最好收发都是放在线程里。
      

  7.   

    谢谢可我改为SendMessage还是一样的啊:(
      

  8.   

    况且debug就可以,release就不行!   郁闷…………
      

  9.   

    与你的方法基本一样:我用的是SendMessage(...),由WindowProc接收消息。
    请参考:如急需我有完整的程序。DWORD FAR PASCAL CommWatchProc(LPSTR) 
    {       DWORD dwEvtMask; 
            OVERLAPPED os; 
            int nLength; 
            BYTE abIn[1024];         memset(&os,0,sizeof(OVERLAPPED));         // create I/O event used for overlapped read         os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
            if (os.hEvent==NULL) 
            {       MessageBox(NULL,"Failed to create event for thread!","GPS Error!",MB_ICONEXCLAMATION|MB_OK); 
                    return ( FALSE ) ; 
            }         if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE); 
             
            while (CONNECTED( npGPSInfo)) 
            {       dwEvtMask=0 ; 
                    WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL); 
                     
                    if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR) 
                    {       do 
                            {       if (nLength=ReadCommBlock((LPSTR)abIn,1024)) 
                                    {       //WriteCommBlock((LPSTR)abIn,nLength ); 
                                            *(abIn+nLength)=0; 
                                            ::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); 
                            } 
                            } 
                            while ((nLength>0)&&(CONNECTED( npGPSInfo))); 
                    } 
            }         CloseHandle(os.hEvent); 
            THREADID(npGPSInfo)=0; 
            HTHREAD(npGPSInfo)=NULL; 
            return(TRUE); 
    }
      

  10.   

    我也比较同意楼上几位的看法,我觉得是你的消息处理机制用法不当!从你的源程序看来不存在问题。你把消息处理换成DefWindowProc,然后if(message == ...),这样试试行不行。