关于MFC UI线程的问题 UI 线程 创建了 一个Socket线程。需求是:socket线程接收到某个消息后,自动退出程序。请问 如何实现?直接调用PostMessage(...WM_CLOSE...) 好像没作用。另外,作为UI创建出来的Socket线程,它可以去关闭UI线程么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 直接调用PostMessage(...WM_CLOSE...) 好像没作用。另外,作为UI创建出来的Socket线程,它可以去关闭UI线程么?==========你PostMessage是怎么写的呢?窗口句柄对不对呢?子线程去关闭UI线程当然是可以的。其实发WM_CLOSE就行。 接收线程里PostMessage(...WM_CLOSE...)?阻塞掉了, 思路有问题。再整理一下。是这样的。MFC工程,我在Dlg(其实也是一个线程 对吧)里,创建了一个后台线程,用于处理socket消息。现在,我想在Dlg结束之前,比如触发了OnCancel的时候,先判断一下 socket线程还健在否。如果健在,那就一直等待。就是想实现这个功能的。 在Dlg中用WaitForSingleObject(线程句柄,INFINITE);等待,如果线程还在,这个语句会阻塞住,如果不在了,这个语句会返回,不过有个缺陷,界面也会被阻塞住的。 回4楼、5楼:我使用WaitForSingleObject(Infinite),完全没反应。也就是说,程序就阻塞在那里了。可能的原因是,socket线程调用了sendMessage()和UI线程进行了交互,这导致了程序挂在那里没反应。当我把sendmessage换成了postmessage(), 虽然可以解决WaitForSingleObject的问题,但是PostMessage会出现UI线程无法全部解析数据的问题。如果自己设计消息队列,又涉及到不停的开启关闭关键区域线程保护的问题,影响效率。请问 是否有相关经验?多谢。 退出程序? exit(0); 无论哪个线程都行. 你的问题如果用WaitForSingleObject虽然能达到目的,但是界面会阻塞,这个是WaitForSingleObject决定的,没办法。是不是换个想法,由socket线程在结束时通知主线程。你可以设一个标志位,如果socket线程的结束消息来时,将这个标志位设为TRUE,在Dlg结束前查询一下这个标志位即可。 楼主做一个全局标志,Socket线程启动时把它搞成TRUE,socket线程结束时把它搞成FALSE,不就行了吗? 你到底是要无限等待 知道后台线程完成 还是直接跳出Oncancel 语句 void CXXDialog::OnCancel(){GetExitThreadCode(handle, &dwExitCode);if(STILL_ACTIVE == dwExitCode){ // ...线程还在运行}else CDialog::OnCancel();} 对话框销毁的问题及对话框之间传递数据 用HGE游戏平台能开发出中国象棋这种游戏来吗?用hge就不用MFC了? 关于对话框中创建状态栏的问题。 请教这四种指针释放方法有什么不同。 OnReceive中多次调用Receive的问题 关于MSCHART不刷新数据的问题 一个有关网络编程方面的问题! 初学不太懂! CListCtr控件中我从数据库中添加进了若干行记录,现在我想双击其中的一条,弹出一对话框,这是响应什么消息? 请问怎样生成log窗口 设备(USB口)数据--PC (USB口),PC从设备读取数据 当鼠标滑过菜单栏时,出现反色或其他不同的颜色,这个是由菜单的哪个属性决定的?
==========
你PostMessage是怎么写的呢?窗口句柄对不对呢?子线程去关闭UI线程当然是可以的。其实发WM_CLOSE就行。
阻塞掉了,
再整理一下。
是这样的。
MFC工程,我在Dlg(其实也是一个线程 对吧)里,创建了一个后台线程,用于处理socket消息。
现在,我想在Dlg结束之前,比如触发了OnCancel的时候,先判断一下 socket线程还健在否。
如果健在,那就一直等待。就是想实现这个功能的。
我使用WaitForSingleObject(Infinite),完全没反应。也就是说,程序就阻塞在那里了。
可能的原因是,socket线程调用了sendMessage()和UI线程进行了交互,这导致了程序挂在那里没反应。当我把sendmessage换成了postmessage(), 虽然可以解决WaitForSingleObject的问题,但是PostMessage会出现UI线程无法全部解析数据的问题。如果自己设计消息队列,又涉及到不停的开启关闭关键区域线程保护的问题,影响效率。请问 是否有相关经验?多谢。
是不是换个想法,由socket线程在结束时通知主线程。你可以设一个标志位,如果socket线程的结束消息来时,将这个标志位设为TRUE,在Dlg结束前查询一下这个标志位即可。
Socket线程启动时把它搞成TRUE,socket线程结束时把它搞成FALSE,不就行了吗?
{
GetExitThreadCode(handle, &dwExitCode);
if(STILL_ACTIVE == dwExitCode)
{
// ...线程还在运行
}
else
CDialog::OnCancel();
}