在线等!!!关于WINDOWS程序设计中一小段话的理解。

yiruirui0507 2010-12-13 08:22:36
队列和同步


当使用者按下并释放键盘上的键时,Windows和键盘驱动程序将硬件扫描码转换为格式消息。然而,这些消息并不保存在消息队列中。实际上,Windows在所谓的「系统消息队列」中保存这些消息。系统消息队列是独立的消息队列,它由Windows维护,用于初步保存使用者从键盘和鼠标输入的信息。只有当Windows应用程序处理完前一个使用者输入消息时,Windows才会从系统消息队列中取出下一个消息,并将其放入应用程序的消息队列中。

此过程分为两步:首先在系统消息队列中保存消息,然后将它们放入应用程序的消息队列,其原因是需要同步。就像我们刚才所学的,假定接收键盘输入的窗口就是有输入焦点的窗口。使用者的输入速度可能比应用程序处理按键的速度快,并且特定的按键可能会使焦点从一个窗口切换到另一个窗口,后来的按键就输入到了另一个窗口。但如果后来的按键已经记下了目标窗口的地址,并放入了应用程序消息队列,那么后来的按键就不能输入到另一个窗口。


问题:但如果后来的按键已经记下了目标窗口的地址,并放入了应用程序消息队列,那么后来的按键就不能输入到另一个窗口。
这里理解不了,既然后来的按键已经记下了目标窗口地址,那么就能输入到相应的窗口中吧,窗口地址这里跟窗口句柄在这里差不多吧,人家应该会根据句柄或者地址输入到对应的窗口才对吧,
请问这里如何理解?
“同步”是什么意思?求详细点的解释,3Q!
...全文
111 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzw820626 2010-12-14
  • 打赏
  • 举报
回复
同步就是你让别人干一件事,你就在那里等,一直到别人干完,你才去干别的事。
异步就是你让别人干一件事,你不等,直接玩去了。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yiruirui0507 的回复:]
难道每个窗口都有一个消息队列?这个我有点不知所措了。。。。。。。
我感觉是:这里的两个窗口每人各自有一个消息队列
同步的意思就是:哪个窗口的消息发送到那个窗口的消息队列中
不能把这个窗口的消息发送到另外一个窗口的消息队列中?

这。。。。。。。。。
[/Quote]

不是的,这里只说了按键和鼠标

并非是所有的消息

另外说 你可以看看sendmessage的函数接口 如果没有记错的话第一个就是句柄 如窗体句柄,所以不是

只能发送给同一窗体
yiruirui0507 2010-12-13
  • 打赏
  • 举报
回复
寡人愚见:
这里的同步就是“将上一个字符输出完成后再输出下一个字符”...看起来好像是废话...不过确实是这样的...
比如你从键盘输入abcd,由于可能我们输入的速度比应用程序处理的速度快,然后我们按下tab切换到另一个窗口输入defg,我们希望把abcd输出到X窗口,在应用程序还没处理完成之前,假如只输出了a ,bcd还没输出,这个时候焦点转移到了Y窗口并且输入了defg,此时尽快bcd还没输出,但是接下来程序所作的事情是把bcd输出到X窗口尽管焦点已经移到了Y上,因为在消息中已经记录了窗口句柄,所以能实现所谓的同步

书上说,只有当Windows应用程序处理完前一个使用者输入消息时,Windows才会从系统消息队列中取出下一个消息,并将其放入应用程序的消息队列中。也就成了实现上述同步的基础。
这里我认为系统消息队列的作用就是记录所有OS能感知的消息,当然必定包含了消息对应窗口对应的句柄,以方便把消息发送给哪个窗口处理函数,这应该也是系统消息队列的一个强大作用吧。当然需要补充一点的是,系统消息队列咋么知道把消息放到哪个线程或者进程队列中?这个应该在OS中自行会判断的,微软并没有透露细节吧。。。。。。但是消息结构体中是有句柄的,可以对应到线程的具体窗口上,这点应该毫无疑问是对的。

同时也有一点疑问:
只有当Windows应用程序处理完前一个使用者输入消息时,Windows才会从系统消息队列中取出下一个消息,并将其放入应用程序的消息队列中。
照这个说法,那每个线程的消息队列中只有一条消息???不可能吧?绝对不可能。那何必要队列呢,吃饱撑地?那关于这点又该如何理解?
还有另一个疑问:如果那句话说的是真的,那系统消息队列岂不是很复杂??冗余量岂不是很大?万一我属于一片文章,我打字足够快的话,那不是有N个按键消息在系统消息队列?(PS:当然这个不是我们所需要关心的,只是有点好奇罢了,细节估计知道的人也不会很多,都怪微软没透露过多细节,整个一个“黑匣子”),打了这么多字,手冷的难过,就此打住吧,一发不可收拾就悲剧了。。。。。。。。。。

yiruirui0507 2010-12-13
  • 打赏
  • 举报
回复
难道每个窗口都有一个消息队列?这个我有点不知所措了。。。。。。。
我感觉是:这里的两个窗口每人各自有一个消息队列
同步的意思就是:哪个窗口的消息发送到那个窗口的消息队列中
不能把这个窗口的消息发送到另外一个窗口的消息队列中?

这。。。。。。。。。
yiruirui0507 2010-12-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 liuxiaoyi666 的回复:]
同步就是处理没有完成 就一直等待 如sendmessage

异步就是处理没有完成 可以接着完成别的 如postmessage
[/Quote]
恕小弟愚昧,对应这里该如何解释?
  • 打赏
  • 举报
回复
同步就是处理没有完成 就一直等待 如sendmessage

异步就是处理没有完成 可以接着完成别的 如postmessage

16,472

社区成员

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

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

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