首先我定义了一个串口类创建了一个接收线程,当串口收到数据的时候发送消息到主框架(mainframe)进行数据处理,此时如果弹出一个模态对话框(例如messagebox),就有可能导致程序错误,不是每次弹出都有错误,但是多弹出几次就一定会出现一个“致命的程序错误”,如果弹出的是非模态的对话框就没有问题.
出现错误提示的同时,也会弹出下面程序里面由于不能从串口读取数据而弹出的“Error in read from serial port”对话框。
while (pThis->m_hComPort != INVALID_HANDLE_VALUE)
{
//等待串口的事件发生
WaitCommEvent (pThis->m_hComPort, &dwCommModemStatus, 0);
if (dwCommModemStatus & EV_RXCHAR)
{
ClearCommError(pThis->m_hComPort,&dwErrorFlags,&ComStat);
//cbInQue返回在串行驱动程序输入队列中的字符数
dwLength=ComStat.cbInQue;
if(dwLength>0)
{
//从串口读取数据
char* buf = new char[dwLength];
fReadState=ReadFile(pThis->m_hComPort,buf,dwLength,&dwLength,NULL);
if(!fReadState)
{
//不能从串口读取数据
MessageBox(NULL,TEXT("Error in read from serial port"),TEXT("Read Error"),MB_OK);
return;
}
else
{
//把数据赋值给全局变量
memset(pThis->m_RecvString, 0, 100);
memcpy(pThis->m_RecvString, buf, dwLength);
::PostMessage(pThis->m_ParentWnd, WM_RECV_DATA, 0, dwLength);//发送消息至主框架
}
delete[] buf;
}
}
GetCommModemStatus (pThis->m_hComPort, &dwCommModemStatus);
}
是由于模态对话框引起的线程阻塞?内存泄露? 还是什么原因.....
但是如果把::PostMessage(pThis->m_ParentWnd, WM_RECV_DATA, 0, dwLength);修改成为
SendMessage(pThis->m_ParentWnd, WM_RECV_DATA, 0, dwLength);就不存在这样的问题了...为什么呢?
相当于现在我有两个线程,一个主线程,一个是串口的接受线程,而从接收线程用PostMessage发消息会出错(在有模态对话框的情况下),模态对话框会导致这两个线程怎样?