中图分类号:TP337 文献标识码:A
Discussing of Auto adaptation Technic in System Simulation
SUN Dong-yan, XLI Ming, FENG Wen-ruing
(16th Brigade of Dalian Naval Academy, Dalian 116018, China)
Abstract: In the course of system simulation, the update of software and hardware will bring bad influence to simulative function and display effect usually. How to keep the simulation effect unfluctuating when the software and hardware is changed is one of primary questions in the course of system simulation. Autoaclaptation teclanic can sove this problem preferably when the simulation is still in program design phase. This paper indicated the
Key words: system simulation; autoaclaptation; interface adjust
1 引言
一个较大的工程项目往往需要开发很长时间,而在此过程中,所使用的软件开发工具和硬件设备也在日益更新。例如软件开发工具从VC++5.0版本、VC++6.0版本发展到现在的VC++net版本,硬件设备如显卡、声卡、CPU以及显示器和网络设备的更新换代频率都在加快。如何在软硬件变化后仍然保持已有程序的可用性是每个程序开发者必须考虑的问题。一般情况下软件的升级不会对原有程序产生太大的影响,因为考虑到编程语言和工具的发展,原有代码都有较好的可移植性。但是硬件的更新往往会对仿真的效果甚至功能产生较大的影响。系统仿真软件开发阶段的自适应技术可以较好地解决这一问题。因为一般情况下更新后的硬件设备性能都要高出更新前的设备性能,所以总的工作思路是在程序运行之初自动检查硬件配置的属性,然后将硬件属性动态调整到程序运行所需状态以保证仿真的效果达到最佳。为介绍简便起见,本文仅就程序界面仿真中显示器更新所带来的分辨率和刷新率调整问题进行简单的探讨。
2 提出问题
在系统仿真过程中,最后达到的模拟逼真度高低不仅取决于所用数学模型正确与否,而且与界面的显示,人机交互页面是否友好有紧密关系。所以在系统仿真过程中,界面的显示调整有着重要的地位。为了能够达到最好的仿真效果,在项目开发之初,仿真系统的程序开发往往都是基于现有显示器的最佳分辨率和刷新率,尤其是人机交互界面更迭较多的程序。其中的图形显示(尤其是动态图形显示),标准控件大小和形状的设定,窗口的分割等部分都是基于现有显示器的最佳分辨率进行编制的。但是当显示器的变换引起最佳分辨率改变时往往会导致预先设计的显示界面不再适应显示器的问题。例如各个标准控件大小和形状的改变,特别是象雷达显示页面,视频和一些人机交互对话框页面。这样一来,为使界面更加友好而做的前期工作就可能前功尽弃。
3 解决办法
在使用VC++作为开发工具时,可以在程序开始阶段自动检测程序运行的显示器的分辨率和刷新率,如果检测结果与原程序运行所需设置不符则强制将显示器的分辨率和刷新率设置为原来的数值,为不影响其他程序的运行效果,在程序运行结束的时侯再将显示器的分辨率恢复到原始设定值。
3.1 获取显示器的分辨率和刷新率
先用下面所列函数获取显示器的分辨率和刷新率,使之与设定值相比较,若相同,则不作修改,若不同,则对其进行动态调整。因所用函数相同,为避免重复,函数的介绍、使用和实现方法在下面详述。
3.2 动态调整显示器分辨率
3.2.1 所用函数VC++中的函数ChangeDis. playSettings()。此函数能够按照客户需要对显示设备作出相应的修改。函数申明如下:
LONG ChangDisplaySettings ( LPDEVMODE lpDevMode, DWORD dwflags) ;
各参数解释如下:
lpDevMode:一个指向DEVMODE数据结构的指针。DEVMODE的数据结构描述了欲设定显示器的各类属性值。
通常情况下使用到的参数如下:
dmSize:所用DEVMODE数据结构的大小(以Bytes为单位)
dmBitsPerpel:每像素所使用的显存位数(Bits)
dmPelsWidth Pixel width:水平分辨率(点数)
dmPelsHeight Pixel height:垂直分辨率(点数)
dmDisplayFrequency Mode frequency:显示刷新率,以赫兹为单位
dmFields:通常情况下,不同的显示设备(如打印机)用到的DENMODE数据结构的内容不同,比如设定打印机时,不会用到dmDiaplayFrequency属性。所以,在使用DEVMODE数据结构时,应向系统说明具体用到的有效数据成员,dmFields的用处便在于此。如果程序中只用到dmPelsWidth和 dmPelsHeight,那么该值应为DM-PELSWIDTH | DM-PELSHEIGHT。
Dwflags:表明对显示设备的修改方式。
具体取值有以下几种:
0:动态改变显示设备属性
CDS-UPDATEREGISTRY:动态改变显示设备属性并修改注册表相关设置,下次启动计算机时,本次所作的修改依然有效
CDS-TEST:测试所作的修改是否有效
返回值:
DISP-CHANGE-SUCCESSFUL:修改成功
DISP-CHANGE-RESTART:修改后需要重新启动
DISP-CHANGE-FAILED:修改失败
DISP-CHANGE-BADMODE:修改模式错误
当lpDevMode为NULL而且dwflags为0时,显示设备使用注册表当前值。
3.2.2 实现方法
在基于单文档创建的工程中可以在Cmain-
DEVMODE lpDevMode;
lpDevMode, dmPelsWidth = 1024 ;
lpDevMode, dmPelsHeight = 768 ;
lpDevMode, drnDisplayFrequency = 85 ;
lpDevMode, dmSize = sizeof(lpDevMode) ;
lpDevMode, dmFields= DM-PELSWIDTH | DM-PELSHEIGHT | DM-DISPLAYFREQUENCY;
//以下一段代码检验是否设置成
//功,在程序编制完成后应该删去
LONG result;
result = ChangeDisplaySettings( &lpDevMode, 0) ;
if (result= = DISP-CHANGE-SUCCESSFUL )
{
AfxMessageBox( "修改成功 ") ;
ChangeDisplaySettings (&lpDevMode, CDS-UPDATEREGISTRY);
//表示修改是持久的并在注册.
//表中写入了相关的数据
}
else
{
AfxMessageBox(“修改失败,恢复原有设置!”);
ChangeDisplaySettings(NULL,0);
}
上一段代码强行将显示器的分辨率设为1024*768,将刷新频率设为85HZ。这样一来可能要牺牲更高级显示器的诸多优势。例如程序运行时需要调用一些动态的视频图像,图像显示的逼真度可能会因此而略受影响。但是对于总体的仿真效果来讲,这种方法还是利大于弊。
左面三幅图分别为某一程序人机界面在分辨率调整前后的变化。从三幅图的对比中可以看到硬件属性的改变甚至可以影响到仿真系统的功能。而图1无疑是使用者最希望达到的仿真效果,此方法可以在硬件设备变化时通过程序控制来使仿真界面达到理想的效果。
4 结论
为使仿真的系统在硬件环境发生变化后仍然逼真,必须在软件设计时保证程序在运行时能够自动检测并适应新的硬件属性。文章从系统仿真中抽出一个典型的事例,即通过软件设计保证在显示器变更之后仍然能够达到最佳的仿真效果阐述了在系统仿真中自适应技术的重要性,对系统的仿真提供了一种思维方法。参考文献
[1] 周鸣杨.Visual c++界面编程技术[M].北京:北京希望电子出版社,2003.2.
[2] David J. Kruglinski, Scot Wingo & George Shepherd. Visual C ++6.0技术内幕(第五版)[M].北京:北京希望电子出版社,2002.3.
[3] 网管科技.Visual c++6.O时尚编程百例[M].北京:机械工业出版社,2003.6.
共0条 [查看全部] 网友评论