问一个线程向对话框发消息的问题

hll127 2011-10-17 10:14:42
我用MFC的向导建立一个对话框程序,在对话框的OnInitDialog中开启一个线程AfxBeginThread(CommuProc, 0),这个线程很简单,如下:
UINT CommuProc(LPVOID pParam)
{
::PostMessage(hDlgWnd, CM_TEST1, 0, 0);//hDlgWnd是对话框的窗口句柄
::PostMessage(hDlgWnd, CM_TEST2, 0, 0);

return 0;
}

对话框中添加对CM_TEST1和CM_TEST2的处理OnTest1和OnTest2,我试验了两种情况:
1.OnTest1里做一个很费时的操作,比如10个for (int i = 0; i<10000000;i++);OnTest2就随便打印一句话,结果是:必须等OnTest1算完了,OnTest2的打印才显示出来。
2.OnTest1里打开一个模态对话框A,DoModal后加个打印,OnTest2里还是打印,结果是:OnTest2的打印立刻出来了,关掉模态对话框A后OnTest1的打印才出来。

按理来说DoModal之后OnTest不就停在DoModal里了吗?怎么还能在关闭模态对话框A的情况下把OnTest2的打印输出呢?为什么情况1里就不能输出OnTest2的打印呢?这两种情况有区别吗?
...全文
146 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2011-10-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hll127 的回复:]

"想来想去, 除非modaldialg的消息循环临时替代了父窗口的消息循环, 并将消息分发出去.
而且是sendmessage直接响应(postmessage仍然需要父窗口消息循环啊)否则找不到更合理的解释了"---我也觉得是这样。
[/Quote]

你看看DoModal代码就知道,里面的确进行消息处理了。DoModal里依然要处理本线程的很多消息,只是屏蔽了父窗口的一些跟激活相关的消息(也可以通过Disable父窗口达到类似效果),如果DoModal内不处理本线程的消息,那么,本线程内除此模态对话框之外的窗口将不可能被重画。
hll127 2011-10-18
  • 打赏
  • 举报
回复
我觉得最不能理解的地方就是,DoModal之后,对话框对CM_TEST1消息的处理就停在DoModal里了,那么对话框再收到其他消息的时候肯定是要等CM_TEST1处理完了才能处理吧,我测试的第一种情况可以证明我的想法。所以你说消息过了,我觉得不是很准确。这个帖子和我问的问题也一样:http://topic.csdn.net/u/20100331/14/46fed685-e765-4599-b8c2-740cbe0375cf.html
[Quote=引用 3 楼 zxdyu2009 的回复:]
答:在OnTest1弹出一个模态对话框A,以至于处理消息的时候,阻塞在A了,但是消息已经过了
[/Quote]
hll127 2011-10-18
  • 打赏
  • 举报
回复
"想来想去, 除非modaldialg的消息循环临时替代了父窗口的消息循环, 并将消息分发出去.
而且是sendmessage直接响应(postmessage仍然需要父窗口消息循环啊)否则找不到更合理的解释了"---我也觉得是这样。
hll127 2011-10-17
  • 打赏
  • 举报
回复
哦,我又搜了些资料,就是说创建子模态对话框后是由子对话框来处理父对话框的消息循环了。和我这个疑惑类似的还有打开子模态对话框后父对话框还能处理定时器消息的问题:http://topic.csdn.net/u/20090630/15/ebb84171-c96e-4892-84c0-3a6f3ba7eddd.html
zxdyu2009 2011-10-17
  • 打赏
  • 举报
回复
1.OnTest1里做一个很费时的操作,比如10个for (int i = 0; i<10000000;i++);OnTest2就随便打印一句话,结果是:必须等OnTest1算完了,OnTest2的打印才显示出来。
答:因为主对话框从消息队列中取出第一条消息,处理,第二消息还没取出来。
2.OnTest1里打开一个模态对话框A,DoModal后加个打印,OnTest2里还是打印,结果是:OnTest2的打印立刻出来了,关掉模态对话框A后OnTest1的打印才出来。
答:在OnTest1弹出一个模态对话框A,以至于处理消息的时候,阻塞在A了,但是消息已经过了 ,在第二消息取出来,打印出来了,当A关闭后,OnTest1中DoModal
之后 的语句被执行,于是打印出来。
Eleven 2011-10-17
  • 打赏
  • 举报
回复
你的子对话框DoModal()会阻塞父窗口的大部分消息,但并不是所有的消息处理
用户 昵称 2011-10-17
  • 打赏
  • 举报
回复
DoModal并不耗费cpu,而你那个大循环肯定耗费cpu,加个Sleep( 1 ),情况应该有变化。

PostMessage是发出消息就返回,SendMessage是发出消息,等待函数执行完再返回,你换SendMessage试试。

15,471

社区成员

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

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