WM_QUIT,WM_CLOSE区别[转]

2023-05-16

 

 

总结:我们要使用代码关闭程序的话,应该向窗口发送WM_CLOSE或者直接调DestroyWindow(HWND)函数   (默认情况下WM_CLOSE的消息响应就是调用DestroyWindow(HWND)   函数,所以我们直接调用也达到一样的效果).这样可以令操作系统回收窗口占用着的内存资源后再退出程序.

千万不要直接用PostMessage(WM_QUIT);令程序退出,这样程序是可以退出了,但是窗口占用的内存资源就没办法回收,久而久之程序就运行出错了.

-------------------------------------------------------------------------------------------------------

使用PostMessage(WM_QUIT)退出程序时导致的内存泄漏!

我最近在程序开发中发现我的一个程序运行一段时间以后,就会导致系统崩溃,初步分析以后,得出得结论是有内存泄漏。

     经使用NuMega BoundsChecker分析以后发现都是一些系统文件中动态分配的内存模块没有被释放,由于这些new都在VC调用的系统文件中无法用调试的方法更正。于是我生成了一个我的程序的MFC外壳,后台的消息处理一条也不处理。检查发现还是有内存泄漏。我的程序外壳是单文档的,VIEW类是从CFormView继承来的,BoundsChecker分析结果如下:

 

一次偶然的机会我发现我的一些错误的产生被BoundsChecker指向了

IMPLEMENT_DYNCREATE(CTest1View, CFormView)

即VC中的动态生成宏。既内存的泄漏与MFC的基类中的NEW有关,

由此我在视类的虚析构函数中设置了断点,调试发现果然程序退出时没有执行到

视类的析构函数,当然就会发生内存泄露了,进一步分析发现:原来我在程序中

为了在退出时显示一个与splash screen类似的窗口,而重载了退出函数,

void CTest1View::OnAppExit()
{

     //闪现splash screen窗口...........


AfxGetMainWnd()->PostMessage(WM_QUIT);
}

最后使用了向窗口发送退出消息的方法来退出程序,这种方式绕过了一些

窗口的退出时的析构处理,导致了程序的出错。

由此可见,我们在编程的时候一些看似正确,编译运行通过的程序也可能

有一些隐藏的BUG,我的程序也是在长时间不间断的运行中才发现的问题,

而一些不长时间运行的程序,就有可能忽略了这样的问题。

 

-----再转另外一篇文章

 

特殊的WM_QUIT消息

    发送WM_QUIT消息可以让Window程序关闭,但经测试用下面程序却无法达到目的:

    CWnd *pWnd = CWnd::FindWindow(NULL, “My Window”);

HWND hWnd = pWnd->GetSafeHwnd();

    SendMessage(hWnd, WM_QUIT, 0, 0);

    而经过尝试,发现用PostMessage却可以:

    PostMessage(hWnd, WM_QUIT, 0, 0);

    不知道原因,当然要查MSDN了,看一下MSDN的介绍:

The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.

    从MSDN的解释上看,感觉SendMessage比PostMessage更加安全,因为,SendMessage要等到窗体消息处理完才返回,而PostMessage发送消息后就立即返回,这更令人茫然。既然从这上面看不出SendMessage无法实现的原因,那么就从消息WM_QUIT上查。

The WM_QUIT message indicates a request to terminate an application and is generated when the application calls the PostQuitMessage function. It causes the GetMessage function to return zero.

    当应用程序调用PostQuitMessage函数的时候, WM_QUIT消息终止一个程序的,它促使GetMessage函数返回0。

    可这里根本就没提SendMessage无法完成终止程序的原因。但在Remark中,却有这样一句:

Do not post the WM_QUIT message using the PostMessage function; use PostQuitMessage。至于为什么,就得看PostQuitMessage做什么事了。现在不讨论为什么不让使用PostMessage发送WM_QUIT消息,但就为什么SendMessage无法完成PostMessage能完成的功能来做一下研究。

注意到WM_QUIT消息让消息循环终止归根结底是让GetMessage返回为0,而GetMessage函数是从消息对列里取一条消息,然后再返回,只能当消息为WM_QUIT时才返回0结束消息循环。再仔细看一下SendMessage的注释发现,SendMessage直接发送到窗口,并调用窗口处理程序,完成消息响应,即SendMessage 根本就没有将消息发到消息对列中,因此GetMessage无法从消息对列中收到WM_QUIT的消息。而PostMessage却直接发送消息到消息对列中,然后立即返回,这一点点的区别就解决了我们上面的问题。

    了解了这一点,就不难理解上面注释中说的为什么不让直接使用PostMessage来发送WM_QUIT消息来终止程序了。

    另外需要注意的是,发送消息让对话框关闭,应该发送WM_CLOSE或者直接调用)消息,这样可以让对话框完成它自身的资源释放回收。

转载于:https://www.cnblogs.com/Dennis-mi/articles/3370099.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WM_QUIT,WM_CLOSE区别[转] 的相关文章

  • ESP32设备驱动-BME680环境传感器驱动

    BME680环境传感器驱动 文章目录 BME680环境传感器驱动 1 BME680介绍 2 硬件准备 3 软件准备 4 驱动实现 1 BME680介绍 BME680 是一款集成环境传感器 专为尺寸和低功耗是关键要求的移动应用和可穿戴设备而开

随机推荐

  • ESP32设备驱动-HDC2080温湿度传感器驱动

    HDC2080温湿度传感器驱动 文章目录 HDC2080温湿度传感器驱动 2 硬件准备 3 软件准备 4 驱动实现 HDC2080 器件是一款集成式湿度和温度传感器 可在小型 DFN 封装中以极低的功耗提供高精度测量 基于电容的传感器包括新
  • ESP32设备驱动-BMP388气压传感器驱动

    BMP388气压传感器驱动 文章目录 BMP388气压传感器驱动 1 BMP388介绍 2 硬件准备 3 软件准备 4 驱动实现 1 BMP388介绍 BMP388 是一款非常小巧 低功耗和低噪声的 24 位绝对气压传感器 它可以实现精确的
  • ESP32设备驱动-BMA400加速度传感器驱动

    BMA400加速度传感器驱动 文章目录 BMA400加速度传感器驱动 1 BMA400介绍 2 硬件准备 3 软件准备 4 驱动实现 1 BMA400介绍 BMA400 是第一款真正的超低功耗加速度传感器 不会影响性能 BMA400 具有
  • ESP32设备驱动-BH1745NUC 亮度和颜色传感器驱动

    BH1745NUC 亮度和颜色传感器驱动 文章目录 BH1745NUC 亮度和颜色传感器驱动 2 硬件准备 3 软件准备 4 驱动实现 BH1745NUC 是具有 I C 总线接口的数字颜色传感器 IC 该 IC 感应红光 绿光和蓝光 RG
  • ESP32设备驱动-LPS25H压阻式压力传感器驱动

    LPS25H压阻式压力传感器驱动 文章目录 LPS25H压阻式压力传感器驱动 1 LPS25H介绍 2 硬件准备 3 软件准备 4 驱动实现 1 LPS25H介绍 LPS25H 是一款超紧凑型绝对压阻式压力传感器 它包括一个单片传感元件和一
  • ESP32设备驱动-LPS25H压阻式压力传感器驱动

    1 LPS22HB介绍 文章目录 1 LPS22HB介绍 2 硬件准备 3 软件准备 4 驱动实现 LPS22HB 是一款超紧凑型压阻式绝对压力传感器 可用作数字输出气压计 该设备包括一个传感元件和一个 I2C 接口 该接口通过 I2C 或
  • ESP32设备驱动-LIS3MDL磁场传感器驱动

    LIS3MDL磁场传感器驱动 文章目录 LIS3MDL磁场传感器驱动 1 LIS3MDL介绍 2 硬件准备 3 软件准备 4 驱动实现 1 LIS3MDL介绍 LIS3MDL 具有 4 8 12 16 高斯的用户可选满量程 自检功能允许用户
  • Stm32L0 STM32CUBE中UART和使用LPUART1以及串口不进中断问题解决

    使用STM32CUBE配置串口USART2 USART2中断 使用STM32CUBE配置串口LPUART1 xff0c 这个串口要配置115200可能需要修改时钟 xff0c 太低的系统时钟可能无法达到这个速度 配置中断LPUART1 GP
  • ESP32设备驱动-BMM150数字地磁传感器驱动

    BMM150数字地磁传感器驱动 文章目录 BMM150数字地磁传感器驱动 1 BMM150介绍 2 硬件准备 3 软件准备 4 驱动实现 1 BMM150介绍 BMM150 是一款低功耗 低噪声的 3 轴数字地磁传感器 用于罗盘应用 具有
  • ESP32设备驱动-VEML7700光照度传感器驱动

    VEML7700光照度传感器驱动 1 VEML7700介绍 文章目录 VEML7700光照度传感器驱动 1 VEML7700介绍 2 硬件准备 3 软件准备 4 驱动实现 VEML7700 是一款高精度环境光数字 16 位分辨率传感器 它包
  • ESP32设备驱动-TSL2591数光转换器驱动

    TSL2591数光转换器驱动 文章目录 TSL2591数光转换器驱动 1 TSL2591介绍 2 硬件准备 3 软件准备 4 驱动实现 1 TSL2591介绍 TSL2591 是一款非常高灵敏度的光数字转换器 可将光强度转换为能够直接 I2
  • 数字图像处理与Python实现-图像滤波-Frangi滤波器

    Frangi滤波器 文章目录 Frangi滤波器 1 Frangi滤波器及其数学描述 2 代码实现 1 Frangi滤波器及其数学描述 Frangi滤波器是Koen L Vinc Alejandro F Frangi Wiro J Nies
  • OpenCV4.x图像处理实例-搭建身份识别系统

    搭建身份识别系统 文章目录 搭建身份识别系统 1 人脸识别系统介绍 2 人脸特征数据提取 3 人脸识别模型训练 4 从静态图像进行身份识别 5 从视频流识别身份 在本文中 将介绍如何使用 OpenCV 搭建一个人脸检测与身份识别系统 为了构
  • ESP32-设备驱动TMP102数字温度传感器驱动

    TMP102数字温度传感器驱动 文章目录 TMP102数字温度传感器驱动 1 TMP102介绍 2 硬件准备 3 软件准备 4 驱动实现 1 TMP102介绍 TMP102 器件是一款数字温度传感器 非常适合需要高精度的 NTC PTC 热
  • ESP32设备驱动-Si1145红外接近-紫外 (UV) 指数和环境光传感器驱动

    Si1145红外接近 紫外 UV 指数和环境光传感器驱动 文章目录 Si1145红外接近 紫外 UV 指数和环境光传感器驱动 1 Si1145介绍 2 硬件准备 3 软件准备 4 驱动实现 1 Si1145介绍 Si1145 46 47 是
  • ESP32设备驱动-PCF8575IO扩展器驱动

    PCF8575IO扩展器驱动 文章目录 PCF8575IO扩展器驱动 1 PCF8575介绍 2 硬件准备 3 软件准备 4 驱动实现 1 PCF8575介绍 PCF8575用于两线双向总线 I2C 的 16 位 I O 扩展器专为 2 5
  • ESP32设备驱动-Si4703调频收音机模块驱动

    Si4703调频收音机模块驱动 文章目录 Si4703调频收音机模块驱动 1 Si4703介绍 2 硬件准备 3 软件准备 4 驱动实现 1 Si4703介绍 Si4702 03 FM 无线电接收器系列通过小尺寸和电路板面积 最少的组件数量
  • ESP32设备驱动-PCA9685 LED控制器驱动

    PCA9685 LED控制器驱动 文章目录 PCA9685 LED控制器驱动 1 PCA9685介绍 2 硬件准备 3 软件准备 4 驱动实现 1 PCA9685介绍 PCA9685 是一款 I C 总线控制的 16 通道 LED 控制器
  • 飞桨EasyDL闪退解决方法

    当点击训练时 xff0c 软件消失 xff0c 用cmd运行软件查看输出信息未见异常 解决办法 xff0c 换一台电脑安装 xff0c 很大概率就好了
  • WM_QUIT,WM_CLOSE区别[转]

    总结 我们要使用代码关闭程序的话 应该向窗口发送WM CLOSE或者直接调DestroyWindow HWND 函数 默认情况下WM CLOSE的消息响应就是调用DestroyWindow HWND 函数 所以我们直接调用也达到一样的效果