📄 subject_60484.htm
字号:
<p>
序号:60484 发表者:狂战士 发表日期:2003-11-13 17:12:16
<br>主题:困扰两天的问题(关于线程,许多网友已看过,麻烦再看看)!
<br>内容:创建一个线程监视串口,当有一个字符来时,产生一个事件,现在出现一个问题,第一次可以正确接收到字符,第二次就接收不到了!跟踪了一下,发现线程都没有启动。我按照有些网友的指点进行了修改,可以接收了,但是程序运行不到2分钟就死机了!<BR>附上串口监视线程<BR>DWORD willRead=0;<BR>UINT CommProc(LPVOID pParam)<BR>{<BR> CTESTDlg *pDlg=(CTESTDlg*)pParam;<BR> OVERLAPPED os;<BR> DWORD dwMask, dwTrans;<BR> COMSTAT comStat;<BR> DWORD dwErrorFlags;<BR> memset(&os, 0, sizeof(OVERLAPPED));<BR> os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);<BR> if(os.hEvent==NULL)<BR> {<BR> AfxMessageBox("CommProc CreateEvent failed");<BR> return -1;<BR> }<BR> for( ; ; )<BR> {<BR> ClearCommError(h_Com,&dwErrorFlags,&comStat );<BR> if(comStat.cbInQue)//串口接收字节数不为零<BR> {<BR> //无限等待WM_MYNOTIFY消息处理完<BR> WaitForSingleObject(pDlg->m_hPostMsgEvent,INFINITE);<BR> ResetEvent(pDlg->m_hPostMsgEvent);<BR> willRead=comStat.cbInQue;<BR> pDlg->PostMessage(WM_MYNOTIFY,EV_RXCHAR,0);<BR> continue;<BR> }<BR> <BR> dwMask=0;<BR> if(!WaitCommEvent(h_Com,&dwMask,&os))<BR> {<BR> if(GetLastError()==ERROR_IO_PENDING)<BR> // 无限等待重叠操作结果<BR> GetOverlappedResult(h_Com, &os, &dwTrans, TRUE);<BR>//////////////////////去掉这一段就可以连续接收,但2分钟以后一定死机////////////////////<BR>// else<BR>// {<BR>// CloseHandle(os.hEvent);<BR>// return (UINT)-1;<BR>// }<BR>// <BR>////////////////////////////////////////////////////////////////////////////////////<BR> }<BR> <BR> }<BR>Sleep(1);<BR> CloseHandle(os.hEvent);<BR> return 0;<BR>}
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:狂战士 回复日期:2003-11-13 23:38:51
<br>内容:我顶!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:狂战士 回复日期:2003-11-14 10:27:04
<br>内容:请看过的网友把可能出错的帮我指正一下!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:红苹果 回复日期:2003-11-14 19:42:38
<br>内容:这样44:<BR>DWORD willRead=0;<BR>UINT CommProc(LPVOID pParam)<BR>{<BR> CTESTDlg *pDlg=(CTESTDlg*)pParam;<BR> OVERLAPPED os;<BR> DWORD dwMask, dwTrans;<BR> COMSTAT comStat;<BR> DWORD dwErrorFlags;<BR> memset(&os, 0, sizeof(OVERLAPPED));<BR> os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);<BR> while(pDlg->m_bConnected )// 串口关闭就为0,打开就为1,由界面控制<BR> {<BR> WaitCommEvent(h_Com,&dwMask,&os);<BR> if( WaitForSingleObject(os.hEvent,INFINITE) == WAIT_OBJECT_0 ) <BR> {<BR> if( (dwMask & EV_RXCHAR) == EV_RXCHAR )<BR> {<BR> if( WaitForSingleObject(pDlg->m_hPostMsgEvent,INFINITE)==WAIT_OBJECT_0 )// 你要保证这里不出问题,也就是说,你话框类处理WM_MYNOTIFY消息的函数中要保证m_hPostMsgEvent无论如何必须为信号态<BR> {<BR> ClearCommError(h_Com,&dwErrorFlags,&comStat );<BR> if(comStat.cbInQue)//串口接收字节数不为零<BR> {<BR> ResetEvent(pDlg->m_hPostMsgEvent);<BR> willRead=comStat.cbInQue;<BR> pDlg->PostMessage(WM_MYNOTIFY,EV_RXCHAR,0);<BR> }<BR> }<BR> }<BR> ResetEvent( os.hEvent );// 复位监视事件为非信号态,准备监视下次事件<BR> }<BR> }<BR> CloseHandle(os.hEvent);<BR> return 0;<BR>}<BR><BR><BR>2003-11-14 22:55:09
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -