关于上面的问题的代码框架是这样的
<1> 接收串口数据的辅助线程函数UINT ReadComData(LPVOID pParam)
{
    while(bContinue)
    {
        WaitData();
        ReadData(data,len);
        
        WaitForSingleObject(hSynEvent,INFINITE);//hSynEvent是用CreateEvent创建的同
                                                //步对象,HANDLE类型,初始化为有信号
        ResetEvent(hSynEvent);
        用data和len修改全局变量FrameData[]和nDataLen...
        SetEvent(hSynEvent);
        ::PostMessage(hWnd,WM_COMM_DATA,0,0);//hWnd为主窗体句柄,WM_COMM_DATA为自
                                             //定义消息
        Sleep(0);
    }
    
    return 0;
}
<2> 采集开关量的线程函数UINT SampleIOData(LPVOID pParam)
{
    while(bContinueIO)
    {                                             //hSynEventIO为同步对象与hSynEvent
        WaitForSingleObject(hSynEventIO,INFINITE);//类似,等待主线程处理完后再采集,
        采集开关量数据...                         //以免采到数据处理时的中间(临时)
                                                  //信号
        WaitForSingleObject(hSynEventIO,INFINITE);
        ResetEvent(hSynEventIO);
        用采集到的开关量数据更新全局变量IOData[]...
        SetEvent(hSynEventIO);
        ::PostMessage(hWnd,WM_IO_DATA,0,0);//hWnd为主窗体句柄,WM_IO_DATA为自
                                             //定义消息
        Sleep(0);
    }    return 0;
}
<3> 主线程响应消息WM_COMM_DATA的函数
LRESULT MyClass::OnCommData(WPARAM wParam,LPARAM lParam)
{
     WaitForSingleObject(hSynEvent,INFINITE);
     ResetEvent(hSynEvent);     ...
     处理串口数据...
     ...
     if(有错误)
         MessageBox("串口数据...错误","comm");     SetEvent(hSynEvent);
}响应消息WM_IO_DATA的函数
LRESULT MyClass::OnIOData(WPARAM wParam,LPARAM lParam)
{
     WaitForSingleObject(hSynEventIO,INFINITE);
     ResetEvent(hSynEventIO);     ...
     处理开关量数据...
     ...
     if(有错误1)
         MessageBox("开关量1...错误","io");     if(有错误2)
         MessageBox("开关量2...错误","io");     SetEvent(hSynEventIO);
}
以上是程序的大致框架,共3条线程。其中在OnCommData函数中的MessageBox处偶尔的死过一次,但在OnCommData函数中的某一处MessageBox(比如“有错误2”处)死机的频率比较高,
另一处的却基本没出现死机情况。
请大家帮忙分析,谢谢!