SDI应用程序调用DestroyWindow()退出程序出现异常引起的一些思考

本文详细介绍了如何在SDI应用程序中创建线程、调用第三方动态库进行周期性数据采集处理,并通过重载CMainFrame类的DestroyWindow()函数管理线程资源。特别关注了点击关闭按钮与直接调用DestroyWindow()函数在消息处理过程的差异,最终提出了解决方案以确保程序安全退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建一个SDI应用程序SimSence。

2. 在CSimSenceView创建线程,调用第三方动态库,进行周期性数据采集处理。

3. 重载CMainFrame类DestroyWindow()函数,在该函数中设置线程jieshu释放加载的Dll等资源。 

4. 添加工具栏图标按钮,ID为ID_EXIT_BAR,并为该按钮添加消息处理 函数OnExitProgramme(),在OnExitProgramme()中调用DestroyWindow(),目的是退出应用程序。

实际结果是:

        1. 点击退出按钮图标,调用DestroyWIndow()关闭了CMainFrame主框架窗口,但由于数据采集处理线程中申请的资源还没有释放,线程仍在运行导致程序崩溃。

        2. 直接点击主框架窗口的关闭按钮,数据采集线程可以正常退出,从而程序也可以正常结束运行。


由此引起的思考是:点击关闭按钮和直接调用DestryWindow()函数MFC的消息处理过程有何不同?

DestroyWindow()关闭当前窗口,销毁与指定CWnd窗口对象关联的窗口,但未销毁CWnd对象,这种方法适合关闭当前窗口时使用。

点击关闭按钮发送是WM_CLOSE消息,SendMessage(WM_CLOSE),此时CMainFrame会收到WM_CLOSE消息。CFrameWnd(CMainFrame的父类)间接会调用CWnd::DestroyWindow;它首先向CSimSenceView发送WM_DESTORY和WM_NCDESTROY消息,并触发相应的处理函数;在CSimSenceView的析构函数中执行了确保采集完全退出并释放资源的逻辑后,程序安全退出。

解决办法是:

在OnExitProgramme()函数中添加如下语句:

AfxGetMainWnd()->SendMessage(WM_CLOSE);替代DestroyWindow();

由于对MFC的应用程序框架和消息映射机制认识有限,能想到的只有这些。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值