求教消息循环嵌套的问题

dengsf 2012-09-06 09:57:01
某些界面api内部又会启动一个消息循环,直到满足一定条件才退出。
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu
mfc的CSocket的“同步阻塞”也用类似方式来模拟。
这样从使用者角度来看,这些api好像是阻塞的,有结果才返回。但消息队列依然运转,界面不会卡住。

我的问题是,能否得到 启动和退出内部循环 的通知?
这个通知不一定是消息,也可以是回调或其它方式。
当然,可能不是所有情况都能得到通知(例如用户自建的循环),
那系统api(domodal、messagebox、tracepopupmenu等)启动的循环 是否能得到?
如果都用mfc提供的api,又能否得到?
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengsf 2012-09-10
  • 打赏
  • 举报
回复
再up一下。
大家都说下看法啊,
有明确结论当然最好。。能得到通知,或有明确资料或例子说明无法得到。
不管最终如何,探讨下机制也是有收获的。
dengsf 2012-09-07
  • 打赏
  • 举报
回复
up..回复内容太短了
Daisy__Ben 2012-09-06
  • 打赏
  • 举报
回复
SetWindowsHookEx
Daisy__Ben 2012-09-06
  • 打赏
  • 举报
回复
孩纸 自己多思考问题就解决了。把
GetMessage(...)
DispatchMessage(...);
的while循环拆开,放在线程过程的不同地方,同样也是消息循环。
同样,把消息循环拷贝一份 放到其他地方,就知道为线程什么会卡在其它窗口消息中了,
得到通知很简单,SetWindowsHookEx,这些都是windows编程书本的东西

dengsf 2012-09-06
  • 打赏
  • 举报
回复
不知 1 楼指的“每个窗口都有”的“消息循环”是什么?

消息队列一个线程里只有一个,
而我说的消息循环是指类似以下的代码。

while( GetMessage(...) ){
TranslateMessage(...);
DispatchMessage(...);
}

大部分程序只有一个且放在最外层(例如WinMain)

但上面提到的DoModal内部却是另起循环的,直到对话框结束才退出。
我的问题是,能否得知“另起循环”这样的事件或通知?

ouyh12345 2012-09-06
  • 打赏
  • 举报
回复
某些界面api内部又会启动一个消息循环,直到满足一定条件才退出。
例如:对话框的DoModal,消息框的MessageBox,菜单的 TracePopupMenu

这些都是窗口,有自己的消息循环,不占用其它窗口的消息循环
mfc是消息分发的机制
dengsf 2012-09-06
  • 打赏
  • 举报
回复
3楼的朋友,明白你的意思,我知道消息循环是到处都可以写的。不过我问题是,别的地方另起循环能否得到通知。
5楼的朋友,我也是这样理解的。只是阻塞消息不尽相同,对话框才会阻塞键盘鼠标,而菜单则一失去焦点就退出循环。

另起循环,从系统的角度看就是消息处理程序还未完成,又来取下一条消息。。但对于处理中又sendmessage的也有类似情况,通用情况无法检查。那放窄一点,对于DoModal、MessageBox、TracePopupMenu之类,是否有办法知道它们启动、退出消息循环的时机?
最好是在最基层的地方得到(这就可以做成单独模块用在任何程序中),而不必和具体窗口布局联系。
钩子的方式,前提是这个事件会触发消息吧?还是说监测所有消息自己判断?恳请指教。
Eleven 2012-09-06
  • 打赏
  • 举报
回复
这些都有他们自己的消息循环,会阻塞父窗口的消息(注意不是阻塞父窗口的所有消息)。

15,979

社区成员

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

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