添加线程后主框架窗口无法关闭

gomez11544 2012-11-29 08:11:13
我使用serialport类来和串口通信,发现在线程中用WriteToPort发送数据如果OnCommunication没有收到数据的话主窗口可以退出但是如果OnCommunication收到数据的话主窗口无法退出下面是代码:(好心人求解)
LONG CMainframe::OnCommunication(WPARAM ch, LPARAM port)
{
......
SetEvent(hEvent2);
}
UINT MyThread(LPVOID lpParam)
{
threadruning=true;
while(!exitFlg)
{
do{
if(exitFlg)
goto EXITTHREAD;
}while(!WaitForSingleObject(hEvent1,1000))//延时
for(;instrument<lastinstrument;)
{
while(WaitForSingleObject(hEvent2,200))//等待
.....
m_port.WriteToPort();//向串口发数据
instrument++;
}
////刷新视图
instrument=0;

}

EXITTHREAD:
threadruning=false;
return 0;

}
void CMainframe::OnClose//关闭
{
exitFlg=true;
SetEvent(hEvent2);
SetEvent(hEvent1);
CMDIAutoHideFrame::OnClose(); ...关闭不了
}
...全文
160 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2012-11-30
  • 打赏
  • 举报
回复
for(; (!exitFlg) && instrument<lastinstrument;)
schlafenhamster 2012-11-30
  • 打赏
  • 举报
回复
volatile BOOL exitFlg;
弱水垂钓 2012-11-30
  • 打赏
  • 举报
回复
引用 4 楼 gomez11544 的回复:
这个我试过在别处同样方法都能关闭线程,就是在void CMainframe::OnClose里关闭的时候总是卡住。
那你就在onClose里下断点,看看程序进不进断点呗
弱水垂钓 2012-11-30
  • 打赏
  • 举报
回复
引用 3 楼 gomez11544 的回复:
do{ if(exitFlg) goto EXITTHREAD; }while(!WaitForSingleObject(hEvent1,1000))//延时 上面有exitFlg判断是否要退出线程啊
你自己下断点看看你退出时,线程在哪个循环里吧
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
这个我试过在别处同样方法都能关闭线程,就是在void CMainframe::OnClose里关闭的时候总是卡住。
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
do{ if(exitFlg) goto EXITTHREAD; }while(!WaitForSingleObject(hEvent1,1000))//延时 上面有exitFlg判断是否要退出线程啊
弱水垂钓 2012-11-30
  • 打赏
  • 举报
回复
引用 1 楼 gomez11544 的回复:
while(!WaitForSingleObject(hEvent1,1000))//延时 for(;instrument<lastinstrument;) { while(WaitForSingleObject(hEvent2,200))//等待 ..... m_port.WriteToPort();//向串口发数据 instrument++; }
你收到数据后event为有信号状态,这几个循环都要进吧,而你在循环里没有判断当前是否需要退出循环甚至退出线程,所以线程就一直在循环里走,退不出来 尽管你在MainFrame的退出代码中设置信号为有信息状态,但是这信号只是影响你循环进行的开关,而不能让循环结束 hEvent1,hEvent2都为有信号时,while(WaitForSingleObject(hEvent2,200))//等待 跳出循环第一次写writetoport,而WaitForSingleObject(hEvent1,1000)返回0,!一下就变1, while(!WaitForSingleObject(hEvent1,1000))//延时就是一直为真,之后又开始判断while(WaitForSingleObject(hEvent2,200)),你线程还能退出?
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
schlafenhamster 2012-11-30
  • 打赏
  • 举报
回复
看看接受代码
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
....代表省略
schlafenhamster 2012-11-30
  • 打赏
  • 举报
回复
“OnCommunication收到数据的话” 没处理?
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
void CMainFrame::OnClose() { 我在里面有添加了WaitForThreadEnd(hEvent1); 发现设断点进行调试时可以退出,不设断点不可以 不知道为什么 } BOOL CMainFrame::WaitForThreadEnd(HANDLE hEvent) { DWORD dwRet; MSG msg; while(1) { dwRet=MsgWaitForMultipleObject(1,&hEvent,FALSE,INFINITE,QS_ALLINPUT); if (dwRet==WAIT_OBJECT_0) { return TRUE; } else if (dwRet==WAIT_OBJECT_0+1) { while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } else { return FALSE; } } }
gomez11544 2012-11-30
  • 打赏
  • 举报
回复
方法都试了,都不行啊 好像是停在UINT APIENTRY _AfxThreadEntry(void* pParam)里的AfxEndThread(nResult);下卡住的

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧