关于上面的问题的代码框架是这样的
<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”处)死机的频率比较高,
另一处的却基本没出现死机情况。
请大家帮忙分析,谢谢!
<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”处)死机的频率比较高,
另一处的却基本没出现死机情况。
请大家帮忙分析,谢谢!
改为::MessageBox(NULL ,"a" ,"b" ,MB_ICONSTOP);