现在做的项目是一个基于MFC对话框的试验数据管理程序,根据试验不同的阶段,要分组显示三批控件:试验参数设置界面、试验答案填写界面、试验结果展示界面。为了界面管理和逻辑管理的方便,使用3个对话框作为容器来包含不同界面的控件。
在程序即将交付时,将程序拿到了一个破机器上跑,发现程序在切换到其他程序或者最小化之后,或者调试切换到VS后,再切换回来会产生程序假死无响应的现象。一开始以为是OSG三维显示模块占用资源过大导致的,结果把OSG模块注释掉之后没有变化。
最后多次测试后发现在程序刚启动后切换没有问题,但是当焦点在那几个容器对话框上之后就会假死。于是调查将对话框作为容器显示的正确方法。发现是少了这么两句:
m_SettingLayer.Create(IDD_DIALOG_SETTINGLAYER, this); m_SettingLayer.MoveWindow(10, 100, 500, 600); //少了这一句,将此对话框作为控件看待 m_SettingLayer.ModifyStyle(0, DS_CONTROL); //少了这一句,使得在主界面可以用tab来导航。 m_SettingLayer.ModifyStyleEx(0, WS_EX_CONTROLPARENT); m_SettingLayer.ShowWindow(SW_SHOW);
加上这两句之后,程序占用从占满i7的25%CPU到现在几乎没什么占用。错怪OSG了。
但是具体这两句话为什么会导致切换程序假死、CPU占用居高不下,暂时没有时间去研究,等以后再追究原因吧。就酱。