窗口过程的可重入性

better0332 2008-04-20 03:50:01
网上有文章是这样说窗口函数的可重入性:

“窗口函数(他是个回调函数)的代码什么时候都可以被系统(调用者一般是user32模块)调用。比如在窗口过程中,向自己的窗口SendMessage(***);那么执行过程是怎样的?
我们知道,SendMessage是要等到消息发送并被目标窗口执行完之后才返回的。那么窗口在处理消息,然后又等待刚才发送到本窗口的消息被处理后之后(SendMessage返回)才继续往下执行,程序不就互相死锁了吗?其实是不会的。windows设计一套适合SendMessage的算法,他判断如果发送的消息是属于本线程创建的窗口的,那么直接由user32模块调用窗口函数(可能就有窗口重入),并将消息的处理结果结果返回。这样做体现了窗口重入。上面的例子,我们调用SendMessage(***)发送消息到本窗口,那么窗口过程再次被调用,处理完消息之后将结果返回,然后SendMessage之后的程序接着执行。对于非队列消息,如果没有窗口重入,不知道会是什么样子。”

我觉得他根本就是瞎说,一个单线程怎么可能作到代码重入,想如果OD断点下在窗口的过程的指令上,系统怎么再调用窗口过程函数!至于上面说的SendMessage在win API中说得很清楚,对于同线程它是立即返回的!!还有网上说的“MessageBox后并不会阻塞主消息循环”,那是因为MessageBox本身也是个窗口,我们的消息是被它接受了,然后MessageBox的窗口过程再调用我们自己编写的主窗口过程,看起来的确很像代码重入而已!

不知道大家是否赞同我的说法,欢迎讨论……
...全文
197 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
百变狸猫 2011-11-10
  • 打赏
  • 举报
回复
貌似是分消息的?有些消息永远不会进入消息循环,都是直接发到窗口过程的?不需要消息队列转发,比如WM_PAINT?
百变狸猫 2011-11-10
  • 打赏
  • 举报
回复
MessageBox应该有自带的消息循环吧?因为在非窗口线程下,messagebox一样可以弹出来.

还有,如果是其他线程or进程使用SendMessage,结果该线程直接调用窗口过程?还是向窗口消息队列发送窗口消息,然后自己等待在消息返回上?
better0332 2008-04-21
  • 打赏
  • 举报
回复
R (Return)吧
cnzdgs 2008-04-20
  • 打赏
  • 举报
回复
Send
Recerved
better0332 2008-04-20
  • 打赏
  • 举报
回复
看来我是误会了,他们说的可重入,就是窗口过程间的递归调用啊!不过“可重入”的确很形象!
顺便问一下,spy++中某些时候消息前会出现S. S.. R. R..什么意思?
以前我为了测试可重入,故意在某个消息中用死循环,不过这又催生了另一个问题,呵呵!
arong1234 2008-04-20
  • 打赏
  • 举报
回复
MessageBox不足以证明或者否认窗口过程的可重入性,你在这个方面分析的是对的。其实messagebox也是窗口,所有窗口都共享当前线程的消息循环,要这也阻塞,那还得了
better0332 2008-04-20
  • 打赏
  • 举报
回复
sendmessage的确如你所说(我以前不知道从哪里看到的),你说的递归调用到很有道理,你觉得我那个MessageBox说的有没有道理?
arong1234 2008-04-20
  • 打赏
  • 举报
回复
你的理解时错误的。可重入在这里等价于一个递归调用,不是只有多线程才有重入概念的
至于SendMessage,我不知道你看的是哪个MSDN,至少microsoft的MSDN说是要调用窗口过程函数的
SendMessage Function:If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. 如果指定的窗口由调用(SendMessage)的线程创建,则窗口过程将立刻被当作一个子过程调用。

显然,如果SendMessage在消息处理函数中被调用,必然会使得代码执行再次进入窗口过程

16,471

社区成员

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

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

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