SDI应用程序调用DestroyWindow()退出程序出现异常引起的一些思考
来源:互联网 发布:淘宝客扣费方式 编辑:程序博客网 时间:2024/06/09 13:47
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的应用程序框架和消息映射机制认识有限,能想到的只有这些。
- SDI应用程序调用DestroyWindow()退出程序出现异常引起的一些思考
- 解决JNI调用DetachCurrentThread程序异常退出的问题
- 由两道题所引起的一些思考
- linux内核中内存分配调用API-引起的一些思考
- Linux程序异常退出打印调用堆栈
- Linux程序异常退出打印调用堆栈
- 一个串口程序引起的思考
- Android 当出现未捕获异常的时候,彻底退出应用程序
- 对异常处理中的一个问题的思考(出现异常,程序仍能继续运行)
- 关于程序异常的思考
- MDI 程序一退出就出现程序异常
- UAT测试后上线出现问题的引起的思考
- 在SDI框架下实现关闭文档而不退出程序的功能
- SIGPIPE信号引起程序退出
- VS出现运行对话框程序 pThread->m_pMainWnd->DestroyWindow(); 错误
- C++程序中如何规避子进程退出过程中出现的异常
- 程序开发的一些思考
- 从秒杀架构引起的一些思考
- postgres插入默认值 如果select查询不到默认值
- 声道
- orale数据类型对应java类型
- OpenCV学习--saturate_cast防止数据溢出
- java.sql.Clob转String
- SDI应用程序调用DestroyWindow()退出程序出现异常引起的一些思考
- OpenCV中图像旋转(warpAffine)算法的实现过程
- 黑马程序员- IOS学习笔记OC核心语法
- 函数专题(简介)
- django 上传文件出现bad request(400)
- 当时只道是寻常
- PAT-BasicLevel 1003 <我要通过>题解
- Grails with ATS Transformation tutorial with a demo example
- 操作符