⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_60484.htm

📁 vc
💻 HTM
字号:
<p>
序号:60484 发表者:狂战士 发表日期:2003-11-13 17:12:16
<br>主题:困扰两天的问题(关于线程,许多网友已看过,麻烦再看看)!
<br>内容:创建一个线程监视串口,当有一个字符来时,产生一个事件,现在出现一个问题,第一次可以正确接收到字符,第二次就接收不到了!跟踪了一下,发现线程都没有启动。我按照有些网友的指点进行了修改,可以接收了,但是程序运行不到2分钟就死机了!<BR>附上串口监视线程<BR>DWORD willRead=0;<BR>UINT CommProc(LPVOID pParam)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;CTESTDlg *pDlg=(CTESTDlg*)pParam;<BR>&nbsp;&nbsp;&nbsp;&nbsp;OVERLAPPED os;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwMask, dwTrans;<BR>&nbsp;&nbsp;&nbsp;&nbsp;COMSTAT comStat;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwErrorFlags;<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(&amp;os, 0, sizeof(OVERLAPPED));<BR>&nbsp;&nbsp;&nbsp;&nbsp;os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(os.hEvent==NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(&#34;CommProc CreateEvent failed&#34;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;for( ; ; )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClearCommError(h_Com,&amp;dwErrorFlags,&amp;comStat );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(comStat.cbInQue)//串口接收字节数不为零<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//无限等待WM_MYNOTIFY消息处理完<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WaitForSingleObject(pDlg-&gt;m_hPostMsgEvent,INFINITE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResetEvent(pDlg-&gt;m_hPostMsgEvent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;willRead=comStat.cbInQue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDlg-&gt;PostMessage(WM_MYNOTIFY,EV_RXCHAR,0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwMask=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!WaitCommEvent(h_Com,&amp;dwMask,&amp;os))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(GetLastError()==ERROR_IO_PENDING)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 无限等待重叠操作结果<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetOverlappedResult(h_Com, &amp;os, &amp;dwTrans, TRUE);<BR>//////////////////////去掉这一段就可以连续接收,但2分钟以后一定死机////////////////////<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(os.hEvent);<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (UINT)-1;<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>////////////////////////////////////////////////////////////////////////////////////<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>Sleep(1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(os.hEvent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;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>&nbsp;&nbsp;CTESTDlg *pDlg=(CTESTDlg*)pParam;<BR>&nbsp;&nbsp;OVERLAPPED os;<BR>&nbsp;&nbsp;DWORD dwMask, dwTrans;<BR>&nbsp;&nbsp;COMSTAT comStat;<BR>&nbsp;&nbsp;DWORD dwErrorFlags;<BR>&nbsp;&nbsp;memset(&amp;os, 0, sizeof(OVERLAPPED));<BR>&nbsp;&nbsp;os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);<BR>&nbsp;&nbsp;while(pDlg-&gt;m_bConnected )// 串口关闭就为0,打开就为1,由界面控制<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;WaitCommEvent(h_Com,&amp;dwMask,&amp;os);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( WaitForSingleObject(os.hEvent,INFINITE) == WAIT_OBJECT_0 ) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( (dwMask &amp; EV_RXCHAR) == EV_RXCHAR )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( WaitForSingleObject(pDlg-&gt;m_hPostMsgEvent,INFINITE)==WAIT_OBJECT_0 )// 你要保证这里不出问题,也就是说,你话框类处理WM_MYNOTIFY消息的函数中要保证m_hPostMsgEvent无论如何必须为信号态<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClearCommError(h_Com,&amp;dwErrorFlags,&amp;comStat );<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(comStat.cbInQue)//串口接收字节数不为零<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResetEvent(pDlg-&gt;m_hPostMsgEvent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;willRead=comStat.cbInQue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDlg-&gt;PostMessage(WM_MYNOTIFY,EV_RXCHAR,0);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResetEvent( os.hEvent );// 复位监视事件为非信号态,准备监视下次事件<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;CloseHandle(os.hEvent);<BR>&nbsp;&nbsp;return 0;<BR>}<BR><BR><BR>2003-11-14 22:55:09

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -