AfxBeginThread中修改GUI的问题

mediocrity 2009-03-08 06:25:27
我本来有一个线程通过AfxBeginThread启动,线程启动以后调用下载函数,然后下载函数绘制界面的进度,和控制下载按钮的状态。

但是后来我需要在下载完成以后做点工作,于是用到了WaitForSingleObject

这个时候问题就出来了,只要我用到了WaitForSingleObject,到了绘制GUI的地方就停掉了,不管是在线程函数里,还是线程调用的下载函数里。

我看WIN32多线程设计里说worker线程只要动了这些貌似就成了GUI线程,我不明白的是,我只用AfxBeginThread去做这个事就可以,但是如果在后面用WaitForSingleObject等待线程结束,就会卡在那些EnableWindow, PostMessage的地方。

求甚解
...全文
89 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mediocrity 2009-03-08
  • 打赏
  • 举报
回复
喔,知道了,谢谢。
cnzdgs 2009-03-08
  • 打赏
  • 举报
回复
这种现象叫做“互锁”,不是死循环。
我的意思是你下载完后给窗口发个自定义消息,窗口收到消息后去解析。
mediocrity 2009-03-08
  • 打赏
  • 举报
回复
我下载一个XML文件,WaitForSingleObject下载完成以后去解析。

我在下载函数里修改下载进度条 ::SendMessage(GetDlgItem(hWnd, IDC_PROGRESS_DL), PBM_SETPOS, (WPARAM) percent, 0L);

意思就是说主线程在用 WaitForSingleObject等待worker线程,worker正在SendMessage等待主线程返回,这个时候都在等,就死循环了,是这样吗?

"可以用工作线程给窗口发消息的方式代替。" 只指代替绘制,还是代替WaitForSingleObject,可以说具体一点吗。我先准备在线程最后通过回调函数来执行,但是查了下CALLBACK的资料貌似很复杂没看明白。

这是我第一次写C++/MFC的东西,不明白的很多,请包涵。
cnzdgs 2009-03-08
  • 打赏
  • 举报
回复
工作线程对UI的各种控制实际上都是SendMessage让主线程来做,在消息处理完后SendMessage函数才会返回,如果主线程正在工作线程,就造成了死锁。你用WaitForSingleObject的目的是什么?可以用工作线程给窗口发消息的方式代替。

15,471

社区成员

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

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