关闭

由一个MFC程序引发的对编程严谨性的思考

77人阅读 评论(0) 收藏 举报
分类:

引言

手上有一个基于MFC的桌面应用程序,其主要功能是:通过串口接收数据,经简单处理后在其页面上进行显示。这个应用程序已经在某台硬件性能稍好的主机上多次运行,并未发现任何异常现象。然而,在一次系统联试中,发生了一个近乎无解的问题:这个应用程序在另一台性能较差的主机上竟然出现了运行即崩溃的现象。项目进度紧张的背景下,这种问题着实让人抓狂,毫无防备。没办法,只能在这台主机上安装编译环境对源码进行调试。由于这台主机过于古老,整个安装过程竟然持续了足有五六个小时,我也只能被迫加班到晚上10点。

问题剖析

经过自己努力和朋友帮忙,最终终于找到了产生上述现象的原因(下面解释中不写具体代码):

1.程序的结构

OnInitDialog()
{
//  创建若干个窗体

//  设置一个定时器
}

OnTimer()
{
// 向各个窗体发送消息,使它们更新各自页面中显示的数据
}

2.原因

程序启动时,首先创建若干个窗体,然后启动定时器,在定时器周期到达时,在定时器响应中向上述窗体发送消息。在原本硬件性能相对较好的主机上,各个窗体的创建完成先于第一个定时器周期的到达,因此程序能够正常运行。而在后来移植到性能较差的主机后,在第一个定时器周期到达时,并非所有的窗体都创建完成,此时向尚未创建完成的窗体发送消息时就引起了程序的崩溃。

3.解决方案

在定时器响应函数中,首先判断是否所有窗体均创建完成(仅判断最后一个窗体的指针是否为空即可)。如果是,则函数直接返回;直到判定所有窗体均创建完成时,才继续执行下面的语句,向各个窗体发消息。此时定时器响应函数的结构如下:

OnTimer()
{
if(最后一个窗体的指针为空)
{
return;
}

// 向各个窗体发送消息,使它们更新各自页面中显示的数据
}

结论

编程切不可偷懒啊,每一条语句都要保证其严谨可靠。否则,说不定哪天你就会为程序中一个小小的疏忽买单!
OnTimer()
{
// 向各个窗体发送消息,使它们更新各自页面中显示的数据
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1996次
    • 积分:180
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条