问题现象:
   我在一个串口类中(参考书上通用的那个cceserial类)接收到一个数据后,就用SendMessage(pSys->m_hWnd,WM_COMM_RXCHAR,(WPARAM)readBuf,NULL);函数将这个字节用消息发送出去。
然后在主对话框中进行消息响应,判断接收一个完整的数据帧后开始帧处理过程。处理过程主要是通过帧的命令,调用新的模态对话框。
    在主对话框和模态对话框中,都有一样的三个按键。按键事件都是先重载
BOOL  CxxxDlg::PreTranslateMessage(MSG* pMsg)     
{
    SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam); 
    return   CDialog::PreTranslateMessage(pMsg);  
}  
然后,void CxxxDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
   问题是:1、如果我在主对话框里,只按键,然后调用子模态对话框,按键返回主对话框,或是按键切换到别的菜单,怎么按都不会死机。
           2、在主对话框里,只接收串口帧数据,在处理函数中,调用子模态对话框,然后在子模态对话框中按键,切换菜单或是返回主对话框,也不会死机。
           3、但只要我接收串口数据后,再在主对话框中按键,程序就立马崩溃。
    刚开始,我怀疑是内存泄露(应该不会立即死机吧),或者是哪地方的指针提前释放,以致于成为野指针,而导致死机。所以,我的串口接收也由之前的接收一个数据帧,改为只接收一个字节。这样也没有申请或释放的问题。但是,问题还是依旧。
    大伙帮我分析一下啊。谢谢了。    怎么搞的,今天怎么老说我没登录呢,好好的登录的的。发表帖子时又让重新登录。幸好保存了所写的,不然就惨了。嘿嘿

解决方案 »

  1.   

    接收是一个单独的线程,代码为:
    DWORD CSysProtocal::ReadThreadFunc(LPVOID lparam)
    {
    CSysProtocal *pSys = (CSysProtocal*)lparam;

    DWORD dwCommStatus = 0;
    DWORD dwNumBytesRead = 0;
    DWORD dwReadErrors;
    COMSTAT cmState;
    BYTE readBuf;
    BOOL bReadResult = FALSE; ASSERT(pSys->m_hComm !=INVALID_HANDLE_VALUE); 

    PurgeComm(pSys->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);

    SetCommMask (pSys->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
    while (TRUE)
    {   

    bReadResult = WaitCommEvent(pSys->m_hComm,&dwCommStatus,NULL);
    if (bReadResult && (dwCommStatus & EV_RXCHAR))
    {
    do
    {
    EnterCriticalSection(&pSys->m_cs);
    ClearCommError(pSys->m_hComm,&dwReadErrors,&cmState);
    if (cmState.cbInQue <= 0)
    {
    continue;
    }
    dwNumBytesRead = 0;
    readBuf = 0;
    bReadResult = ReadFile(pSys->m_hComm,
    &readBuf,
    1,
    &dwNumBytesRead,
    NULL);
    LeaveCriticalSection(&pSys->m_cs);
    if(bReadResult && dwNumBytesRead == 1)
    {
    SendMessage(pSys->m_hWnd,WM_COMM_RXCHAR,(WPARAM)readBuf,NULL);
    }
    }while(bReadResult && dwNumBytesRead == 1);
    }
    if (WaitForSingleObject(pSys->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
    {
    break;
    }
    }
    return 1;
    }
      

  2.   

    debug下崩溃后,从“CallStack”窗口里找错误代码行
      

  3.   

    我现在最怀疑的就是这部分的按键消息部分。刚才试了一下,如果把那三个按键的功能用触摸屏的按键完成,系统不会死机。用的是优龙的yle2440的板子,现在还不知道是不是它的那几个按键在注册表里用作别的快捷功能,对应用程序有影响。
      

  4.   

    debug下崩溃后,从“CallStack”窗口里找错误代码行 feilinhe
     说的是call brower吗?那里面一句话都没有。只有output那地方出现
    The program '[0x23751482] RoomSystem.exe' has exited with code 1067 (0x42b)谢谢大伙支持
      

  5.   

    PreTranslateMessage()函数如果不返回TRUE,则会调用TranslateMessage()和DispachMessage(),这样VK_RETURN消息会再处理的
      

  6.   

    线程,应该是一个全局函数,用while(1)循环让线程在后台处理就行。