📄 subject_25561.htm
字号:
<p>
序号:25561 发表者:sdf 发表日期:2002-12-23 21:03:49
<br>主题:急!急!急!急!急!
<br>内容:我遇见了一个串口通信的问题,下面是我的源代码,我都写注释了,出现的问题是在定时读取数据时进入了死循环(我采用的是定时方式,每200ms读取一次缓冲区数据),出问题的地方我也注出了,希望各位能够多多指教,已经捆饶我很长时间了。<BR><BR>/************************<BR>打开辅助线程函数<BR>*************************/<BR>void CSerialComm::OpenThread()<BR>{<BR> COilLeakingCheckApp* m_lpApp;<BR> m_lpApp = (COilLeakingCheckApp*)AfxGetApp();//取得应用程序类指针<BR> m_lpApp->CreateNewFile(); //创建一个新文挡,用于显示数据,因为我用的是多文挡<BR> CMainFrame* m_lpActivewnd=(CMainFrame*)m_lpApp->m_pMainWnd;//取得主框架的指针<BR> CChildFrame* m_lpChildActivewn=(CChildFrame*)m_lpActivewnd->GetActiveFrame();//取得字框架的指针<BR> if(m_hCOMThread==NULL&&m_Open==TRUE)//<BR> {<BR> m_pWnd=m_lpChildActivewn->m_hWnd;//取得字框架的句柄,该句柄用与将来接受辅助线程发出的消息<BR> if(m_pWnd!=NULL) <BR> {<BR> m_hCOMThread=AfxBeginThread(WaitCOMEvent,&m_pWnd,THREAD_PRIORITY_ABOVE_NORMAL);<BR> }//创建辅助线程<BR> }<BR>}<BR><BR><BR>/********************************<BR>辅助线程的全局响应函数<BR>*********************************/<BR>UINT WaitCOMEvent(LPVOID pWnd)<BR>{<BR> DWORD ReadMask;<BR> DWORD ReadNum;<BR> OVERLAPPED os;<BR> memset(&os,0,sizeof(OVERLAPPED));<BR> os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);<BR> ASSERT(os.hEvent);<BR> COilLeakingCheckApp* m_lpApp;<BR> m_lpApp = (COilLeakingCheckApp*)AfxGetApp();<BR> CMainFrame* m_lpActivewnd=(CMainFrame*)m_lpApp->m_pMainWnd;<BR> if(!SetCommMask(m_lpActivewnd->m_wndDlgBar.m_hCOM,EV_RXCHAR))//监视串口事件为接受数据<BR> return 0;<BR> while(TRUE)//进入死循环,实际上就是辅助线程一直监视串口事件,<BR> {<BR> if(m_lpActivewnd->m_wndDlgBar.m_Exit)//结束辅助线程<BR> {<BR> KillTimer(m_pWnd, 2000);<BR> AfxEndThread(TRUE);<BR> }<BR> ReadMask=0;<BR> if(!WaitCommEvent(m_lpActivewnd->m_wndDlgBar.m_hCOM,&ReadMask,&os))<BR> {<BR> if(!ReadMask&&GetLastError()==ERROR_IO_PENDING)<BR> GetOverlappedResult(m_lpActivewnd->m_wndDlgBar.m_hCOM,&os,&ReadNum,1);<BR> }<BR> if(ReadMask&EV_RXCHAR==EV_RXCHAR)//判断是否是有数据进入缓冲区<BR> {<BR> if(ReadCom)//是一个全局变量,初始化时为真,实际上就是为了定时,出现的问题 //就在这儿,我的程序进入了死循环,本来定时200ms后到定时器的响 //应函数中,重新将ReadCom置为真,开始下一次定时,但现在问题 //ReaddCom当我采集几分钟以后,就一直是False,好象是定时器不起 //作用了,进入死循环<BR> {<BR> ReadCom = FALSE;<BR> ::SetTimer(m_pWnd, 2000, 200, (TIMERPROC)COMTimeProc); <BR> } <BR> }<BR> }<BR> return TRUE;<BR><BR>}<BR>/*************************************<BR>定时器的全局响应函数<BR>***************************************/<BR><BR>VOID CALLBACK COMTimeProc(HWND hWnd, UINT uMsg, DWORD dwTime)<BR>{<BR> ReadCom = TRUE;<BR> KillTimer(m_pWnd, 2000);<BR> if (m_pWnd!=NULL)<BR> { ::PostMessage(m_pWnd,WM_COMM_EVENT,NULL,NULL); }//发送消息到字框架,<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> volatile int _running;<BR> 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> 你能不能给我写写源代码?我的程序就在上面,你看看应该在什么地方加上比较好。但我觉得用辅助线程可能有一个问题,即辅助线程睡了,串口进来的的数据怎么办?因为在定时的时候我的辅助线程还是在监视串口事件,另外,我在定时时,可能是由于线程的调用树太深了,导致堆栈溢出,可是我的定时器我在定时器的全局响应函数里已经Kill掉了,为什么会导致堆栈溢出?<BR><BR><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -