电子海图技术培训,是驾驶员评估考试的重点项目,船员培训单位一般都配备电子海图实验室,执行评估大纲的教学要求和考试要求。电子海图模拟器ECDIS是一套具有重度图形界面的应用软件,是软件就有BUG,ECDIS也不例外。
对话框不能显示的现象
第一步,画好青岛到釜山的计划航线,保存好新航线后关闭退出。
第二步,在菜单中找到航线选项,选择刚才画好的航线名称,调出该航线。再把海图拉到始发点,放大海图比例尺,如下图所示:
第三步,在船舶选项中找到,控制:车舵侧推螺旋桨,这种类似车钟控制的选项,鼠标左键单击,结果,屏幕上什么都没有。
本来应该弹出一个对话框,用来显示车钟和舵角指示器的。但是这个对话框没有弹出来,应用程序没有任何反应。
这是什么原因呢?
第一种可能性:分屏问题
通常情况下,为了满足ECDIS培训业务逻辑上的要求,在显示电子海图模拟器主界面的同时,还会分屏显示雷达模拟器的界面。
类似这样的:
也就是说,一台计算机主机,需要两个显示器来分别显示电子海图模拟器的主界面和雷达模拟器的界面。
在一个主机两台显示器的情况下,如果点击菜单栏,看不见对话框,可能是对话框跑到了另外一个屏幕上。那么,在这两个屏幕上找一找,如果能找到,那说明不是应用程序的问题。如果找不到,那就不好说了。
为了节省一个显示器,同时也为了在操作上更加是省事,海图和雷达显示也可以设计成一台主机,同时在一个显示器上显示这两个模拟器。那么这种情况下,点击菜单看不见对话框弹出的可能性就很小了。
第二种可能性:函数调用没有执行
不管ECDIS的应用程序是哪种语言编写的,都有类似的调用机制。
以常见的C++语言及其框架为例,对话框的调用,通常是COMMAND命令的形式,因为C++是基于消息驱动的函数调用机制。
在常规的MFC程序设计中,通常这个对话框都是非模式对话框。
那么,在ECDIS程序刚刚起来之后,程序就调用对话框对象的 OnInitDialog 成员函数先初始化了。当用户点击菜单栏上的菜单选项ITEM时,鼠标单击的动作就相当于向系统发出了一个COMMAND消息。
在编程的阶段,这条COMMAND消息映射到一个消息处理函数上。在执行的时候,用户一点击菜单选项,消息进入消息循环,然后就会执行这个映射函数,函数在内存中展开后就执行,最后显示这个对话框。
如果由于某些原因,在用户点击菜单选项发出消息后,这个映射函数如果没有执行,那么,不论用户如何点击,对话框也是无法显示的。
也就是说,用户操作后,程序没有进入到函数体当中去,自然就无法显示这个对话框了。
第三种可能性 内存管理出现问题
在C++中,通常都是面向对象OOP的编程模式。
静态变量和全局变量,在编译时就进行BSS区进行内存的分配,并对于已经确定的变量进行初始化。函数内的局部变量,是在函数体执行前分配空间,函数执行完毕后回收空间。
对于定义在函数内部的非静态局部变量,在调用函数时在系统的栈区预先分配好存储空间,并在执行到该变量的声明语句时进行初始化,由于栈区的数据并不会初始化为0,因此若在定义时不进行初始化,则相当于随机初始化。
也就是说,函数内部的非静态局部变量在程序编译阶段,对象创建只是形式上的创建,程序并没有给对象分配内存。当程序执行在该函数时,才会被分配内存空间完成随机初始化。
如果程序员分配的是堆内存,就是用new分配堆内存,用delete来回收的话,也有一种可能性,就是在new的时候出现了内存管理上的问题,导致对话框不能显示。
第三种可能性 操作系统与软件不兼容
C++语言不是跨平台的语言,这种ECDIS软件也通常都在WINDOWS系统上运行的。
WIN10,WIN11,每一代的OS底层封装的API函数可能都有一些差别,例如函数名字的改变。
有些时候可能会产生一些函数调用上的变化。
如果ECDIS在较低版本的OS上运行正常,但是换成较高版本的OS,那就可能导致函数调用出现不匹配或者找不到函数名的情况发生。
同理,如果ECDIS在较高版本上OS上运行正常,但是换成了较低版本的OS,也可能导致同样的BUG发生。
如果再存在调用机制上的改变,问题可能就更加的复杂了。
程序里面有这个函数,但是系统却无法找到这个函数,其运行的结果就是无动作发生。
对话框问题的总结陈词
ECDIS模拟器对话框不能显示的问题,不是很常见,但是一旦出现,问题可能就比较复杂。
或许是软件本身的问题,或许是软件与操作系统兼容的问题,或许是使用方式上的一些问题,。。。,都有可能。
软件是一串一串的代码按照一定的逻辑,堆叠而成的一种程序结构,涉及到的技术有很多。
不论水平多高的程序员,做出的程序都可能出现BUG,但是,出现BUG是正常的,关键是出现BUG后,能够及时有效的解决,是表现一个程序员水平高低的重要标准之一。
写软件很累,涉及到很多框架,IDE,很多语言,语法结构,还涉及到很多专业的算法,以及和另外一个专业技术的对应关系。
因此,航海类的模拟软件也存在这样的问题,实属正常。只要能尽快的找到BUG,测试出程序中的问题,尽快排除故障,也就可以了。
模拟软件通常在陆地上使用,不是在实际生产当中使用,但是如果频繁的出现问题,就说明程序设计和编写的质量不是很高。
如果在实际工作中的设备和软件出现问题,那可能产生很严重的后果。
热切的期望:国内的各位业内大咖,架构师,程序员们,努力奋斗,竭尽全力提高原创软件的质量,提高程序设计的水平。
本人已经长期不在编程第一线,如果技术阐述上有问题,请大咖们斧正,特此感谢。
内容来自李勇老师
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!