为什么 PostQuitMessage 会被设计出来?

news2024/11/18 16:53:40

众所周知,我们可以使用 SendMessage 或者 PostMessage 来发送消息,那为什么在 Win32 API 中,会单独设计一个 PostQuitMessage 呢?

有一位读者 A. Skrobov 问我,”PostQuitMessage 和 PostThreadMessage(GetCurrentThreadId, WM_QUIT) 到底有什么区别,我怎么看起来是一样的效果?”

它们并不等同,尽管乍一看它们可能看起来是这样。差异是微妙的,但很重要。

与 WM_PAINT, WM_MOUSEMOVE 和 WM_TIMER 消息一样,WM_QUIT 消息不是 “真的” 投递的消息。相反,它是系统生成的消息之一,就好像它被投递一样,即使它不是。与其他消息一样,WM_QUIT消息是”低优先级”消息,仅在消息队列为空时才会生成。

当线程调用 PostQuitMessage 时,系统在消息队列中设置一个标志,该标志表示: “如果有人请求获取消息并且队列中没有消息,则创建一条 WM_QUIT 消息。” 这就像其他“虚拟发布”的消息一样。

如果存在任何无效区域,则 WM_PAINT 按需生成消息,如果鼠标自上次检查以来移动,则按需生成WM_MOUSEMOVE 消息,如果有任何到期计时器,则会按需生成 WM_TIMER 消息。

由于消息是“虚拟发布的”,因此多个调用会合并,就像多个绘制消息、多个鼠标移动和多个计时器消息也会合并一样。

为什么 WM_QUIT 被设计为低优先级消息呢?

因为系统尽量不在”糟糕的时间”注入 WM_QUIT 消息,相反,它在生成 WM_QUIT 消息之前等待事情”安定下来”,从而减少了程序可能处于由一系列已发布消息触发的多步骤过程中的可能性。

比如,如果 PeekMessage(…, PM_NOREMOVE) 获取到了 WM_QUIT 消息,这将返回一条 WM_QUIT 消息,但不会清除该标志。WM_QUIT消息实际上“保留在队列中”。

作为另一种特殊行为,生成的 WM_QUIT 消息会绕过传递给 GetMessage 和 PeekMessage 函数的消息筛选器。如果设置了内部”退出消息挂起”标志,则一旦队列为空,无论你通过什么过滤器,你都会收到一条WM_QUIT 消息。

相比之下,PostThreadMessage 只是将消息放在线程队列中(真实,而不是虚拟),因此它不会像 PostQuitMessage 那样会附带一些其他的特殊效果。

总结

根据上文的描述,PostQuitMessage 系统为我们创建的一个 WM_QUIT 消息,不是真实的,只是设置了一个标志位。
PostThreadMessage 则是实实在在的在线程消息队列中放置了一条 WM_QUIT 消息。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why is there a special PostQuitMessage function?》

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyTorch框架】——框架安装使用流程搭建PyTorch神经网络气温预测

目录 一、引言 二、使用流程——最简单例子试手 三、分类任务——气温预测 总结: 一、引言 Torch可以当作是能在GPU中计算的矩阵,就是ndarray的GPU版!TensorFlow和PyTorch可以说是当今最流行的框架!PyTorch用起来简单&#xff…

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(下)

MyEclipse v2022.1.0正式版下载 三、设计编辑基础 “设计”窗口由所见即所得的网页设计画布和UI控制面板组成。在此窗口中,您可以插入、编辑、删除和移动 HTML 和 JSP UI 控件和文本。拖放操作可以轻松实现重新定位设计画布上的UI控件。扩展的复制/粘贴操作能够将…

Unity3D :PlayableGraph

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集: NSDT简石数字孪生 PlayableGraph PlayableGraph 定义一组绑定到 GameObject 或组件的可播放输出项。PlayableGraph 还定义一组可播放项及其依赖关系。图 1 提供了一个示例。 PlayableGraph 负责管理可…

卷积神经网络实例

文章目录 1. 数据输入2. 创建卷积模型并训练3. 超参数选择 卷积神经网络(CNN)主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)和全连接层(Fully-connected Layer)组成。 卷积层(Convolutional Layer):卷积层是CNN的核心组成部…

职场新人如何使用ChatGPT提高工作效率

刚刚从象牙塔中毕业,走向社会战场。作为职场新人的同学们刚刚进入公司和部门,难免会被安排做些本职工作之外的事务工作,被上级安排做些零零碎碎的小东西,俗称打杂。这些工作说难不难,想要做漂亮也并不简单,…

Linux实时监控网卡入流量和出流量(iftop、dstat、nethogs、nload)

背景 相同配置和相同业务的4台cvm,今天准备下线,检查还有没有业务流量的时候,发现有两台流量不符合预期,就很奇怪,想知道流量是从哪里来的。记录下当时定位思路 先来了解下基本的概念 一、Mbps、kbps、bps、bit、b…

光纤仿真相关参数——光纤损耗、数值孔径、归一化参数

对于光纤,不难想象它频带宽、损耗低、重量轻、抗干扰能力强、工作性能可靠、成本低等优点。 光纤的损耗可以用以下公式表示: 在光的传播过程中,会按照光线的功率损耗系数\alpha衰减,单位为 我们可以用经过一端距离l后输出的光功率…

electron 使用electron-packager打linux-x64包与linux-arm64包,解决打包缓慢问题

使用electron-packager打linux-x64包与linux-arm64包,解决下载zip打包缓慢问题 在使用electron-packager打包的过程中,需要在第一次下载electron版本对应的zip文件,下载很缓慢,而且还可能出现每次都在下载zip的情况 解决思路是提前下载好zip文…

【Linux】kill、raise、abort函数

目录 1、kill、raise、abort函数2、代码示例 橙色 1、kill、raise、abort函数 /* #include <sys/types.h>#include <signal.h>int kill(pid_t pid, int sig);- 功能&#xff1a;给任何的进程或者进程组pid, 发送任何的信号 sig- 参数&#xff1a;- pid &#xf…

【LED子系统】六、核心层详解(三)

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录…

腾讯云轻量应用服务器性能测评(全网超详细)

腾讯云轻量应用服务器性能如何&#xff1f;CPU型号主频、内存、公网带宽和系统盘存储多维对比&#xff0c;轻量应用服务器会不会比云服务器CVM性能差&#xff1f;相对于CVM云服务器轻量服务器更适合轻量级的应用&#xff0c;轻量服务适合中小企或个人开发者用于搭建We网站b应用…

测试用例02

复习 基于需求设计测试用例 分析需求&#xff0c;验证需求&#xff0c;细化需求&#xff0c;从需求中提取一个个的测试点&#xff0c;根据每一个测试点&#xff0c;采用具体的设计测试用例的方法取设计测试用例&#xff1a; 有多细致的需求&#xff0c;就有多细致的测试用例&am…

BATJ架构师首推!分布式事务原理与实战,出神入化

前言 广度与深度兼备、理论与实战兼顾的《分布式事务原理与实战》从以下5个维度全面深入的讲解了分布式事务&#xff1a; 基础知识维度&#xff1a;首先全面介绍了事务和分布式事务的概念和基础知识&#xff0c;然后详细讲解了MySQL事务和Spring事务的实现原理。 解决方案维度…

新一代产业变革席卷全球,深眸科技融合AI+机器视觉实现智造升级

随着新一代产业变革席卷全球&#xff0c;人工智能成为变革的核心方向&#xff0c;借助人工智能崛起的东风&#xff0c;机器视觉也逐渐成为工业制造业的必选项。在工业4.0和中国制造2025的推动下&#xff0c;中国制造企业纷纷投入到智能化转型的过程中&#xff0c;但就目前来看&…

YOLO 算法系列

我们分享了YOLO系列的文章&#xff0c;包括前段时间刚刚发布的YOLOv7检测算法&#xff0c;虽然YOLOv7对象检测算法是YOLO最新的模型&#xff0c;且可以支持对象分割&#xff0c;人体姿态检测等&#xff0c;但是最新的YOLO系列检测模型也同步进行了更新&#xff0c;那就是刚刚开…

正版软件,官方授权。RadiAnt DICOM Viewer - 软件版 / CD/DVD版

灵活、简单、快速 RadiAnt 是一个医学图像的 PACS DICOM 浏览器 设计是为了给您独特体验&#xff0c;它界面直观&#xff0c;性能无与伦比&#xff0c;您的体验感一定爆棚&#xff01; RadiAnt DICOM Viewer是一款专为医学影像浏览看图而设计的软件。它具有单个窗口界面&…

全屋智能,始终在等一双“究极手”

《塞尔达传说&#xff1a;王国之泪》是今年迄今为止最火爆的游戏&#xff0c;也是全球科技爱好者在这个5月里共同关注的热门话题。 游戏中&#xff0c;有一个广大玩家津津乐道的新功能&#xff0c;是主角林克具备了一种名为“究极手”的能力。它可以把游戏里的各种各样的物品组…

卷起来!Dr. LLaMA:通过生成数据增强改进特定领域 QA 中的小型语言模型,重点关注医学问答任务...

大家好&#xff0c;最近突然发现了一篇在专门应用于医学领域的LLaMA&#xff0c;名为Dr.LLaMA&#xff08;太卷了太卷了&#xff09;&#xff0c;就此来分享下该语言模型的构建方法和最终的性能情况。 论文&#xff1a;Dr. LLaMA: Improving Small Language Models in Domain-S…

晶能转债,正元转02上市价格预测

晶能转债 基本信息 转债名称&#xff1a;晶能转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;100.0亿元。 正股名称&#xff1a;晶科能源&#xff0c;今日收盘价&#xff1a;12.19元&#xff0c;转股价格&#xff1a;13.79元。 当前转股价值 转债面值 / …

word怎么转换pdf?提供几个思路

在现代互联网时代&#xff0c;我们经常需要将文档转换为PDF格式&#xff0c;以便于共享和打印。虽然Word文件是最常见的文档格式之一&#xff0c;但是许多人不知道如何将其转换为PDF格式。在本文中&#xff0c;我们将介绍如何使用不同的方法将Word文档转换为PDF格式。 使用第三…