如何在主线程中关闭一个用户界面线程

不约姐 2012-12-06 02:20:38
我做了一个程序,是在连接设备的时候模拟一个进度条,显示加载的进度,告诉用户程序还活着。

void CConnectDlg::OnBnClickedOk()//按OK后进行连接
{
//.....省略代码
CWinThread *pThread=AfxBeginThread(RUNTIME_CLASS(CProgressThread));//这个就是一个进度条线程
m_strWaitInfo.Format(_T("正在连接....")); //这个是进度条信息
try
{
xxxx->connect();//连接
m_strWaitInfo.Format(_T("连接成功...."));//显示连接成功
//怎么关掉pThread
}
catch(System::Exception ^e)
{
m_ConnStatusMsg = (CString) e->Message;
m_strWaitInfo = m_ConnStatusMsg; //显示报错信息
//怎么关掉pThread
}
}

现在我的问题是,连接成功后活着报异常后怎么安全关掉这个pThread线程,不要出现内存泄露等危险情况啊?大侠们,帮忙撒!
...全文
196 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaozhiyong110 2012-12-07
  • 打赏
  • 举报
回复
有时我的回答是正确的 结果分给别人了 也不会介意啊 分又没用 当你从这里得到帮助 你也继续帮助别人 这才是主要的
不约姐 2012-12-07
  • 打赏
  • 举报
回复
感谢大家啊,上次问的一个问题我用了50分,答案不是很满意,所以这次我只出了20分。结果现在你们的答案我很满意,怎么办?散多散少大家别介意啊!
华美乐章 2012-12-06
  • 打赏
  • 举报
回复
引用 11 楼 lizeyu_0205 的回复:
引用 10 楼 fengqinqdca 的回复: 引用 7 楼 lizeyu_0205 的回复:你是指直接调用pThread ->ExitInstance()?这样是不行的,关键是我现在怎么都触发不了ExitInstance,还有,貌似ExitInstance执行完以后才return嘛!… 你先把窗口关闭了,就可以执行CProgressThread::ExitInstance了. 哥,你……
那你就先把线程类的窗口关闭, 在调用pThread->PostThreadMessage(WM_QUIT,0,0); 让线程退出. 2楼的方法也是不错的.
不约姐 2012-12-06
  • 打赏
  • 举报
回复
引用 10 楼 fengqinqdca 的回复:
引用 7 楼 lizeyu_0205 的回复:你是指直接调用pThread ->ExitInstance()?这样是不行的,关键是我现在怎么都触发不了ExitInstance,还有,貌似ExitInstance执行完以后才return嘛!… 你先把窗口关闭了,就可以执行CProgressThread::ExitInstance了.
哥,你的方法没问题!
华美乐章 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 lizeyu_0205 的回复:
你是指直接调用pThread ->ExitInstance()?这样是不行的,关键是我现在怎么都触发不了ExitInstance,还有,貌似ExitInstance执行完以后才return嘛!…
你先把窗口关闭了,就可以执行CProgressThread::ExitInstance了.
yaozhiyong110 2012-12-06
  • 打赏
  • 举报
回复
把你CProgressThread的run代码发出来
yaozhiyong110 2012-12-06
  • 打赏
  • 举报
回复
引用 7 楼 lizeyu_0205 的回复:
引用 6 楼 yaozhiyong110 的回复: 引用 4 楼 lizeyu_0205 的回复:引用 2 楼 yaozhiyong110 的回复: CProgressThread类的run里面加个标记flag 要关闭的时候设置这个标记 然后run里面就return run函数不是直接 return CWinThread::Run();还有我设置了flag怎么传给CProgressThre……
你只要保证run函数退出了 线程就执行完了 所以在你想要退出的地方让run return就行了
不约姐 2012-12-06
  • 打赏
  • 举报
回复
引用 6 楼 yaozhiyong110 的回复:
引用 4 楼 lizeyu_0205 的回复:引用 2 楼 yaozhiyong110 的回复: CProgressThread类的run里面加个标记flag 要关闭的时候设置这个标记 然后run里面就return run函数不是直接 return CWinThread::Run();还有我设置了flag怎么传给CProgressThread啊? 返回的CWi……
你是指直接调用pThread ->ExitInstance()?这样是不行的,关键是我现在怎么都触发不了ExitInstance,还有,貌似ExitInstance执行完以后才return嘛!
yaozhiyong110 2012-12-06
  • 打赏
  • 举报
回复
引用 4 楼 lizeyu_0205 的回复:
引用 2 楼 yaozhiyong110 的回复: CProgressThread类的run里面加个标记flag 要关闭的时候设置这个标记 然后run里面就return run函数不是直接 return CWinThread::Run();还有我设置了flag怎么传给CProgressThread啊?
返回的CWinThread *pThread 不就是你的CProgressThread对象指针啊 你直接强转直接加接口 或者成员变量都行啊 或者用5楼的 给线程发消息
华美乐章 2012-12-06
  • 打赏
  • 举报
回复
用主线程,发消息给你的UI线程类,关闭进度条窗口 ::PostMessage(pThread->pLoadingDlg->m_hWnd,WM_CLOSE,0,0); 然后再退出UI线程 HANDLE hThread=pThread->m_hThread; pThread->PostThreadMessage(WM_QUIT,0,0); while(WaitForSingleObject(hThread,200)==WAIT_TIMEOUT) { pThread->PostThreadMessage(WM_QUIT,0,0); }
不约姐 2012-12-06
  • 打赏
  • 举报
回复
引用 2 楼 yaozhiyong110 的回复:
CProgressThread类的run里面加个标记flag 要关闭的时候设置这个标记 然后run里面就return
run函数不是直接 return CWinThread::Run();还有我设置了flag怎么传给CProgressThread啊?
不约姐 2012-12-06
  • 打赏
  • 举报
回复
可否说得具体一些,看得不很明白,我是个菜菜鸟,,,
yaozhiyong110 2012-12-06
  • 打赏
  • 举报
回复
CProgressThread类的run里面加个标记flag 要关闭的时候设置这个标记 然后run里面就return
roger_ding 2012-12-06
  • 打赏
  • 举报
回复
最好的办法是把连接的代码放在新建线程里,然后给主线程发消息,主线程负责监听消息并且显示不同的UI

15,471

社区成员

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

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