【关于SerialPort串口类使用的有关问题?】
【关于SerialPort串口类使用的问题?】
视图类中申明CSerialPort m_Commport;
程序的串口数据操作能连接上。
添加一个按钮A,响应函数中添加
m_Commport.StopMonitoring();//线程挂起(调用SerialPort类中的线程挂起函数)
首先连接上串口,点击A线程挂起,然后关闭程序,界面关闭了,但程序的进程还是在任务管理器中。
然后再添加一个按钮B,响应函数中添加
m_Commport.RestartMonitoring();//恢复线程
首先先连接上串口,然后点击A挂起线程、然后点击B恢复线程,再点击右上角关闭按钮,界面关闭,在任务管理器中的进程也关闭了。
问题是:我准备直接在关闭按钮中调用按钮B的函数,就是首先连接上串口,然后按下A挂起线程,再点击右上角关闭按钮调用B恢复线程并且关闭程序,但是程序进程还是在任务管理器中。
------解决思路----------------------

------解决思路----------------------
这么搞可以达到目的,但是理论上不能这么搞啊!
你不是调用了CFrameWnd::OnClose()了嘛,正常情况下程序会退出的。之所以你的这个没退出,我琢磨着是那个线程的缘故,B中恢复线程,该线程还在跑,你却把主窗口给关掉了.......
1、为嘛恢复线程让线程接着执行,却关闭应用程序?
2、线程何时退出,如何退出?
正常的逻辑应该是这样子的啊:你点击右上角关闭按钮,应该是要先结束线程,由于此时该线程是挂起状态,我琢磨着你就是想先恢复线程,让线程自动跑完吧? 实际上就是这么弄的,关键是你的线程函数写的合不合理了:首先是关闭主窗口这种情况下,线程即使有很多东西要处理,此时也一应不处理,直接返回掉;其次,你得弄个线程退出标志,在线程函数里面不停的去检测该退出标志,符合条件时就立即return 0;最后,为了保证在调用CFrameWnd::OnClose()之前线程已退出,你得在CFrameWnd::OnClose()前面去调用::WaitForSingleObject来检测该线程是否退出,比如检测2秒吧,两秒过后该线程句柄状态还是无效,就强行TerminateThread
------解决思路----------------------
exit你是强制退出进程了。你需要先解决为何线程不退出的问题。
视图类中申明CSerialPort m_Commport;
程序的串口数据操作能连接上。
添加一个按钮A,响应函数中添加
m_Commport.StopMonitoring();//线程挂起(调用SerialPort类中的线程挂起函数)
首先连接上串口,点击A线程挂起,然后关闭程序,界面关闭了,但程序的进程还是在任务管理器中。
然后再添加一个按钮B,响应函数中添加
m_Commport.RestartMonitoring();//恢复线程
首先先连接上串口,然后点击A挂起线程、然后点击B恢复线程,再点击右上角关闭按钮,界面关闭,在任务管理器中的进程也关闭了。
问题是:我准备直接在关闭按钮中调用按钮B的函数,就是首先连接上串口,然后按下A挂起线程,再点击右上角关闭按钮调用B恢复线程并且关闭程序,但是程序进程还是在任务管理器中。
void CMainFrame::OnClose() //主函数中(CAngleView视图函数,A、B函数都在里面)
{
if(MessageBox("确定要退出 ?","Exit",MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2)==IDYES)
{
//断开连接
CMainFrame* pMFram = (CMainFrame*)AfxGetMainWnd();
CAngleView* pView = (CAngleView*)GetActiveView();
pView->B; // 调用B按钮响应函数
CFrameWnd::OnClose();
}
else
{
return ;
}
}
------解决思路----------------------
------解决思路----------------------
这么搞可以达到目的,但是理论上不能这么搞啊!
你不是调用了CFrameWnd::OnClose()了嘛,正常情况下程序会退出的。之所以你的这个没退出,我琢磨着是那个线程的缘故,B中恢复线程,该线程还在跑,你却把主窗口给关掉了.......
1、为嘛恢复线程让线程接着执行,却关闭应用程序?
2、线程何时退出,如何退出?
正常的逻辑应该是这样子的啊:你点击右上角关闭按钮,应该是要先结束线程,由于此时该线程是挂起状态,我琢磨着你就是想先恢复线程,让线程自动跑完吧? 实际上就是这么弄的,关键是你的线程函数写的合不合理了:首先是关闭主窗口这种情况下,线程即使有很多东西要处理,此时也一应不处理,直接返回掉;其次,你得弄个线程退出标志,在线程函数里面不停的去检测该退出标志,符合条件时就立即return 0;最后,为了保证在调用CFrameWnd::OnClose()之前线程已退出,你得在CFrameWnd::OnClose()前面去调用::WaitForSingleObject来检测该线程是否退出,比如检测2秒吧,两秒过后该线程句柄状态还是无效,就强行TerminateThread
------解决思路----------------------
exit你是强制退出进程了。你需要先解决为何线程不退出的问题。