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

原创 2016年08月29日 20:49:54

引言

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

问题剖析

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

1.程序的结构

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

//  设置一个定时器
}

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

2.原因

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

3.解决方案

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

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

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

结论

编程切不可偷懒啊,每一条语句都要保证其严谨可靠。否则,说不定哪天你就会为程序中一个小小的疏忽买单!
OnTimer()
{
// 向各个窗体发送消息,使它们更新各自页面中显示的数据
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

水题其实也能反映思维的严谨性:USACO The Tamworth Two

简单的模拟。需要记录方向和坐标,进行模拟,直到相遇。如何判断永远不相遇呢?可以用bool数组保存已经访问过的位置信息。但是一开始我糊涂了,晕透了我,靠。一开始我都没往下细想就用了两个3维数组来存储,前...

iOS开发自我开发准则之-逻辑严谨性

我们日常研发过程中能涉及到的逻辑有太多太多,我在这里总结一下我在开发中遇到的一些要注意的逻辑方面。...

编写一个MFC程序的主要步骤

一、创建MFC应用程序 1.文件—新建—项目—MFC—MFC应用程序 MFC有三个选项:MFC ActiveX控件、MFC应用程序、MFC DLL。 MFC ActiveX 控件:用来生成MFCAct...

如何创建一个利用UDP实现消息收发功能的MFC程序

首先我们先来开一下所要实现的对话框是什么样子的以及它所要实现的功能; 如图所示,我们的程序需要实现的功能是:向客户机发送数据并接受来自客户机的数据,同时能够统计发送到的和接收到的字节数,并能...

为何一个MFC程序会有时能正常运行,有时却不能正常运行呢? (内容是来自我的一个帖子)

PS:这是来自我的一个帖子 linkTo:   http://bbs.csdn.net/topics/390415152?page=1#post-394121704 这是正常运行时的界面: ...

VC++编程:MFC程序中的WinMain入口函数

程序之家转载文章:     读者还记得我们在第2章中讲述的创建Win32应用程序的几个步骤吗?当时,我们介绍Win32应用程序有一条很明确的主线:首先进入WinMain函数,然后设计窗口类、注册窗口类...

Windows编程入门(5)MFC程序最小托盘化

转载自http://blog.csdn.net/csf111/article/details/6980508   为了使MFC程序(SDI,MDI,DLG)均能最小化到系统托盘,这里运用消息机制来实...

控制台应用程序转成MFC程序错误—OcrRec.exe触发一个触点,原因可能是堆被破坏

在将之前的控制台应用程序转换为MFC程序的过程中,控制台

一个完整的指纹识别MFC程序

  • 2012年07月25日 15:53
  • 700KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:由一个MFC程序引发的对编程严谨性的思考
举报原因:
原因补充:

(最多只允许输入30个字)