cdialog::domodal阻塞问题.

I_NBFA 2010-03-31 02:54:19
刚才有人问问题, 由此我也产生一个问题.
cdialog::domodal到底会不会阻塞父窗口线程?

我一直认为modaldialog产生后会进入一个系统专用的消息循环. 所以并不影响父窗口的消息处理.
比如我生成一个SDI程序, 在其CMyView中放置一个timer, 每5秒弹出一个afxmessagebox.
然后双击cmyview产生一个modaldialog.
void CMyView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

CTestDialog dlg;
dlg.DoModal();
AfxMessageBox(L"ok");

CView::OnLButtonDblClk(nFlags, point);
}

WM_TIMER仍然响应, 也没耽误WM_PAINT.
但是除非关闭modaldialg, 否则afxmessagebox(L"ok")不会执行.
这样看来又象是阻塞的!
想来想去, 除非modaldialg的消息循环临时替代了父窗口的消息循环, 并将消息分发出去.
而且是sendmessage直接响应(postmessage仍然需要父窗口消息循环啊)否则找不到更合理的解释了./
...全文
527 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
I_NBFA 2010-04-01
  • 打赏
  • 举报
回复
我想明白了, 谢谢大家!
fishion 2010-04-01
  • 打赏
  • 举报
回复
你只要简单的想,domodal只是阻塞了主窗口的界面而已,你只是不能点击操作主窗口而已,并不会阻塞除点击,键盘输入等一些消息
job82824 2010-04-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 i_nbfa 的回复:]
引用 7 楼 aa3000 的回复:
modaldialg 内部有自己的消息循环,代替了窗口所在线程的消息循环,消息由它来分发,没有中断

但是怎么解释CMyView::OnLButtonDblClk被中断了?
[/Quote]
是被AfxMessageBox(L"ok");
给中断的,就是说执行到这里一直在等待你点下OK或Cancel按钮后才会往下执行的。不相信的话你可以在下面设置个断点,看看在点击按钮之前能不能执行到OnLButtonDblClk断点
Icedmilk 2010-04-01
  • 打赏
  • 举报
回复
这个问题我很久之前就在这发过贴

总而言之,问题的本质是很简单的。
对于你的OnLButtonDblClk函数来说,调用了domodal之后确实阻塞了。
但是domodal这个函数内部又建立了消息循环所以主线程没有阻塞

参考下这个帖子
http://topic.csdn.net/u/20090630/15/ebb84171-c96e-4892-84c0-3a6f3ba7eddd.html
zyq5945 2010-04-01
  • 打赏
  • 举报
回复
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复
继续顶, 这个问题让我烧心.
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复
up!
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 aa3000 的回复:]
modaldialg 内部有自己的消息循环,代替了窗口所在线程的消息循环,消息由它来分发,没有中断
[/Quote]
但是怎么解释CMyView::OnLButtonDblClk被中断了?
aa3000 2010-03-31
  • 打赏
  • 举报
回复
modaldialg 内部有自己的消息循环,代替了窗口所在线程的消息循环,消息由它来分发,没有中断
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复
uop
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复

[Quote=引用 3 楼 aa3000 的回复:]
引用 2 楼 aa3000 的回复:
阻塞只是不让 ModalDialog 的父窗口被 EnableWindow(FALSE) 而已,其他的什么消息都可以继续


sorry , 语法有问题

阻塞只是 ModalDialog 的父窗口被 EnableWindow(FALSE) 而已,其他的什么消息都可以继续
[/Quote]
UI被冻结了, 消息循环仍然运行.
可消息循环调用OnLButtonDblClk, 它返回之前不可能再getmessage下一个消息啊,
线程应该被中断的.

[Quote=引用 4 楼 aa3000 的回复:]
引用楼主 i_nbfa 的回复:
想来想去, 除非modaldialg的消息循环临时替代了父窗口的消息循环, 并将消息分发出去.
而且是sendmessage直接响应(postmessage仍然需要父窗口消息循环啊)否则找不到更合理的解释了./

就是这个。
[/Quote]
可是当我打开modaldialg时, 往CMyView里postmessage个自定义消息, CMyView仍然响应.....
这说明消息循环仍在运行, 可OnLButtonDblClk还没处理完了啊.
aa3000 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用楼主 i_nbfa 的回复:]
想来想去, 除非modaldialg的消息循环临时替代了父窗口的消息循环, 并将消息分发出去.
而且是sendmessage直接响应(postmessage仍然需要父窗口消息循环啊)否则找不到更合理的解释了./[/Quote]

就是这个。
aa3000 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 aa3000 的回复:]
阻塞只是不让 ModalDialog 的父窗口被 EnableWindow(FALSE) 而已,其他的什么消息都可以继续
[/Quote]

sorry , 语法有问题

阻塞只是 ModalDialog 的父窗口被 EnableWindow(FALSE) 而已,其他的什么消息都可以继续
aa3000 2010-03-31
  • 打赏
  • 举报
回复
阻塞只是不让 ModalDialog 的父窗口被 EnableWindow(FALSE) 而已,其他的什么消息都可以继续
I_NBFA 2010-03-31
  • 打赏
  • 举报
回复
顶下;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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