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

📄 subject_25561.htm

📁 一些关于vc的问答
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<p>
序号:25561 发表者:sdf 发表日期:2002-12-23 21:03:49
<br>主题:急!急!急!急!急!
<br>内容:我遇见了一个串口通信的问题,下面是我的源代码,我都写注释了,出现的问题是在定时读取数据时进入了死循环(我采用的是定时方式,每200ms读取一次缓冲区数据),出问题的地方我也注出了,希望各位能够多多指教,已经捆饶我很长时间了。<BR><BR>/************************<BR>打开辅助线程函数<BR>*************************/<BR>void CSerialComm::OpenThread()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp; COilLeakingCheckApp* m_lpApp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_lpApp = (COilLeakingCheckApp*)AfxGetApp();//取得应用程序类指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_lpApp-&gt;CreateNewFile();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建一个新文挡,用于显示数据,因为我用的是多文挡<BR>&nbsp;&nbsp;&nbsp;&nbsp;CMainFrame* m_lpActivewnd=(CMainFrame*)m_lpApp-&gt;m_pMainWnd;//取得主框架的指针<BR>&nbsp;&nbsp;CChildFrame* m_lpChildActivewn=(CChildFrame*)m_lpActivewnd-&gt;GetActiveFrame();//取得字框架的指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(m_hCOMThread==NULL&amp;&amp;m_Open==TRUE)//<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_pWnd=m_lpChildActivewn-&gt;m_hWnd;//取得字框架的句柄,该句柄用与将来接受辅助线程发出的消息<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(m_pWnd!=NULL)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hCOMThread=AfxBeginThread(WaitCOMEvent,&amp;m_pWnd,THREAD_PRIORITY_ABOVE_NORMAL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}//创建辅助线程<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR><BR>/********************************<BR>辅助线程的全局响应函数<BR>*********************************/<BR>UINT WaitCOMEvent(LPVOID pWnd)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD ReadMask;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD ReadNum;<BR>&nbsp;&nbsp;&nbsp;&nbsp;OVERLAPPED os;<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;ASSERT(os.hEvent);<BR>&nbsp;&nbsp;&nbsp;&nbsp;COilLeakingCheckApp* m_lpApp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;m_lpApp = (COilLeakingCheckApp*)AfxGetApp();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMainFrame* m_lpActivewnd=(CMainFrame*)m_lpApp-&gt;m_pMainWnd;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!SetCommMask(m_lpActivewnd-&gt;m_wndDlgBar.m_hCOM,EV_RXCHAR))//监视串口事件为接受数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;while(TRUE)//进入死循环,实际上就是辅助线程一直监视串口事件,<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m_lpActivewnd-&gt;m_wndDlgBar.m_Exit)//结束辅助线程<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(m_pWnd, 2000);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxEndThread(TRUE);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadMask=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!WaitCommEvent(m_lpActivewnd-&gt;m_wndDlgBar.m_hCOM,&amp;ReadMask,&amp;os))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!ReadMask&amp;&amp;GetLastError()==ERROR_IO_PENDING)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetOverlappedResult(m_lpActivewnd-&gt;m_wndDlgBar.m_hCOM,&amp;os,&amp;ReadNum,1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ReadMask&amp;EV_RXCHAR==EV_RXCHAR)//判断是否是有数据进入缓冲区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(ReadCom)//是一个全局变量,初始化时为真,实际上就是为了定时,出现的问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//就在这儿,我的程序进入了死循环,本来定时200ms后到定时器的响&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//应函数中,重新将ReadCom置为真,开始下一次定时,但现在问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ReaddCom当我采集几分钟以后,就一直是False,好象是定时器不起&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadCom = FALSE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::SetTimer(m_pWnd, 2000, 200, (TIMERPROC)COMTimeProc);&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR><BR>}<BR>/*************************************<BR>定时器的全局响应函数<BR>***************************************/<BR><BR>VOID CALLBACK COMTimeProc(HWND hWnd, UINT uMsg, DWORD dwTime)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ReadCom = TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(m_pWnd, 2000);<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (m_pWnd!=NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;::PostMessage(m_pWnd,WM_COMM_EVENT,NULL,NULL);&nbsp;&nbsp;&nbsp;&nbsp;}//发送消息到字框架,<BR>}<BR><BR>还有一个问题,就是在采集时,我的字框架不能最大化,一最大化就出错,我觉得是我的在打开辅助线程时,是不是我的句柄取的不对啊?问题可能就出在那里。<BR><BR><BR><BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:sdf 回复日期:2002-12-23 21:06:21
<br>内容:对不起有的 地方看起来不很连贯,实际上是上一行的<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>
回复者:songxinye 回复日期:2002-12-23 21:25:18
<br>内容:把线程间的全局变量改成volatile类型
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:sdf 回复日期:2002-12-23 21:38:12
<br>内容:能说的具体一点吗?是那个变量!我定义的变量一个是hWnd,取得是当前子窗口的句柄,你指的是那个变量?多谢谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:songxinye 回复日期:2002-12-23 22:08:47
<br>内容:我在做优化计算时,启动另一个线程进行计算,计算的过程是无限循环,在每次循环时判断是否停止,是靠一个变量的0,或1来决定是否停止,这个变量是在框架菜单上改变的,计算结果在窗口中绘图,是否显示网格也有一个变量定义如下:<BR>&nbsp;&nbsp;&nbsp;&nbsp;volatile int _running;<BR>&nbsp;&nbsp;&nbsp;&nbsp;volatile int _showGrid;<BR>volatile变量最适合比如硬件口地址中数据的状态等,在做控制采集等软件中常用<BR><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>
回复者:sdf 回复日期:2002-12-23 22:26:57
<br>内容:好的,我先试试,另外我在用辅助线程时,老是堆栈溢出,很头疼,怎么才让他能不溢出吗?出的错是0x8000000...只能Read,什么乱七八糟的,反正就是堆栈溢出,该怎么处理?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2002-12-23 22:42:14
<br>内容:u need a Dispatch() to deliver your WM_TIMER message, else u will never<BR>get the TimerProc called. maybe the repeat WM_TIMER crashes your thread's stack<BR>Just a suggestion, wish this help.
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:sdf 回复日期:2002-12-23 22:46:36
<br>内容:如何加一个Dispatch(),在什么地方?<BR><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>
回复者:dr0 回复日期:2002-12-23 23:14:30
<br>内容:u can put it in your GUI thread, then u do not need a Dispatch,<BR>but then u should synchronize your worker thread and GUI thread<BR>to protect ur's share data .
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:不说 回复日期:2002-12-24 00:48:35
<br>内容:定时?搞那么复杂干什么,睡200ms不就得了?……
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:dr0 回复日期:2002-12-24 01:02:06
<br>内容:nice. :D
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:sdf 回复日期:2002-12-24 09:55:34
<br>内容:o_oo_oo_o:<BR>&nbsp;&nbsp;你能不能给我写写源代码?我的程序就在上面,你看看应该在什么地方加上比较好。但我觉得用辅助线程可能有一个问题,即辅助线程睡了,串口进来的的数据怎么办?因为在定时的时候我的辅助线程还是在监视串口事件,另外,我在定时时,可能是由于线程的调用树太深了,导致堆栈溢出,可是我的定时器我在定时器的全局响应函数里已经Kill掉了,为什么会导致堆栈溢出?<BR><BR><BR>

⌨️ 快捷键说明

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