(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf_第1页
(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf_第2页
(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf_第3页
(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf_第4页
(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf_第5页
已阅读5页,还剩48页未读 继续免费阅读

(测试计量技术及仪器专业论文)vxi总线测试软件平台研究——存储功能及仪器控制功能的实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子科技大学硕士学位论文 摘要 ( 自动测试程序的软件开发平台在自动测试系统中占有重要的地位,它是组建 自动测试系统的软件开发工具。经过多年的努力,我们课题组研制成功了一种图 形化的“v x i 总线测试软件开发平台”。本论文是我所分工的研究任务的总结, 它实现了平台的两个重要的技术:存储技术和仪器控制技术。 我们开发的“v x i 总线测试软件平台”基于w i n d o w s 操作系统,和许多大型 的w i n d o w s 应用程序,如w o r d 、e x c e l 、p o w e r p o i n t 一样,平台应该具有存储功 能。本论文深入研究了m f c 的文档视结构、动态生成对象技术以及序列化机制。 设计了一组数据结构来记录构成测试程序的所有图形化编程元素的显示属性和 运行属性值。在用户保存测试程序时,通过m f c 的序列化机制将它们有效的保 存到磁盘文件中;同时在用户读出磁盘文件时,通过m f c 的序列化机制和动态 创建技术将测试程序恢复。实现了平台对测试程序的存储功能。 测试软件平台是面向自动测试领域的测试软件开发平台,对自动测试系统中 的仪器和模块的控制是平台需要实现的重要技术。平台处于整个仪器控制架构的 较上层,平台的上层是测试应用程序,平台以下有仪器驱动库层、v i s a 层、操 作系统层和通信协议层。仪器的最终控制是通过这些层次的分工协作来完成的。 从层次上看,平台只要能完成对仪器驱动库层的成功调用,就可以完成对仪器的 控制。本论文通过对仪器驱动库头文件的分析、对驱动库输出函数参数的解析、 对动态调用驱动库输出函数方法的研究以及大量的实验完成了对仪器驱动库层 的成功调用,从而实现了平台的仪器控制功能。 本论文除研究了平台的存储技术和仪器控制技术以外,还研究了图形化的数 组控件的实现技术,通过对专门的c + + 类的设计,实现了数组控件的显示功能、 多维数组在平台中的动态声明功能和数组类型的数据在平台控件间的传递功能。斗 本论文的主要内容安排如下: 第一章介绍了平台的研制意义、平台的总体框架、开发工具和相关技术。 第二章论述了平台存储功能的实现技术 第三章论述了平台仪器控制功能的实现技术 第四章论述了数组控件的实现技术 第五章对平台的完善和改进阐述了一些个人的建议和想法 关键词:测试软件开发平台;序列化机制:存储技术;仪器驱动库;v 1 s 强 电子科技大学硕士学位论文 a b s t r a c t t h ed e v e l o p i n gp l a t f o r mo ft h ea t p ( a u t ot e s tp r o g r a m ) h a st h em u c hi m p o r t a n t s t a t u si nt h ea u t ot e s ts y s t e m s ,s h ei st h es o f t w a r ef i m d a m e n to f t h ea t s t h er e s e a r c h l e v e lo ft h i sk i n do fp l a t f o r mi st h ei m p o r t a n tc r i t e r i o nm e a s u r i n gt h el e v e lo fo b e c o u n t r y st e s t i n gt e c h n o l o g y t h r o u g ho u re f f o r tf o ry e a r s ,w eh a v ed e v e l o p e da t h i s k i n do f p l a t f o r mf o rgp r o g r a m m i n gl a n g u a g e t h i st h e s i s r e s e a r c hj o b i sa p a r to f t h e r e s e a r c h j o bo f t h ep l a t f o r m t e c h n o l o g y t h i st h e s i sh a sc o m p l e t e dt w ot e c h n o l o g yo f t h e p l a t f o r m ,o n ei s t h e s a v i n gt e c h n o l o g y a n dt h eo t h e ri st h e t e c h n o l o g yo f c o n t r o l l i n gi n s t r u m e n t s a l s o ,t h i sp l a t f o r mi saw i n d o w sa p p l i c a t i o np r o g r a m ,f o rs h ei sd e v e l o p e db a s e d w i n d o w s t h ep l a t f o r ms h o u l dr e a l i z et h es a v i n gf u n c t i o nl i k i n go t h e rl a r g es c a l e w i n d o w s a p p l i c a t i o np r o g r a ms u c ha sw o r d ,e x c e l ,p o w e r p o i n ta n d s oo n t h i st h e s i s h a s d e e p l yr e s e a r c h e dt h ed o c u m e n t v i e wa r c h i t e c t u r eo ft h em f c ,t h ed y n a m i c c r e a t i o nt e c h n o l o g yo ft h em f ca n dt h es e r i a l i z a t i o nt e c h n o l o g yo ft h em f c i ta l s o d e s i g n ss o m e o ft h ed a t as t r u c t u r e st or e c o r dt h ed i s p l a y i n ga n dr u n n i n ga t t r i b u t e so f t h ep r o g r a m m i n ge l e m e n t st h a tc o m p o s e dt h ea t ew h e nt h eu s e rs a v e st h ea t et h e p l a t f o r ms t o r e st h ea t p a saf i l eu s i n gt h es e r i a l i z a t i o nt e c h n o l o g yo ft h em f c w h e n t h eu s e rr e a d st h ea t pf r o maf i l e ,t h e p l a t f o r mt h e nr e s t o r e t h ea t pu s i n gt h e s e r i a l i z a t i o nt e c h n o l o g ya n dt h ed y n a m i cc r e a t i o nt e c h n o l o g yo f t h em f c w h i l et h ep l a t f o r mf a c e st h ef i e l do ft h ea t s ,t h et e c h n o l o g yo fc o n t r o l l i n g i n s t r u m e n ta n dv x im o d u l ei so n eo ft h em o s ti m p o r t a n t t e c h n o l o g yo f t h ep l a t f o r m t h e h i e r a r c h yo fc o n t r o l l i n gi n s t r u m e n t s ,f r o mh i g h e r t ol o w e r ,i sa p p l i c a t i o np r o g r a m , p l a t f o r m ,t h ei n s t r u m e n t sd r i v e rd l l ,v i s a ,o p e r a t i n gs y s t e ma n dp r o t o c o ll e v e lo f t h ec o m m u n i c a t i o n a l lt h e s el e v e lc o o p e r a t ew i t he a c ho t h e rt oc o m p l e t e c o n t r o l l i n g t h ei n s t r u m e n ta n dv x im o d u l e f r o mt h eh i e r a r c h y , w es h o u l dc o n c l u d et h a ti fw e c o u l ds u c c e s s f u l l yc a l lt h ei n s t r u m e n t sd r i v e rd l l ,w ew o u l dc o n t r o li n s t r u m e n t s s u c c e s s f u l l y , t h i st h e s i sh a sr e a l i z e dt h ef u n c t i o no f c a l li n s t r u m e n t sd r i v e rd l l b y a n a l y z i n g t h eh e a d e rf i l eo ft h ed r i v e rd l l ,c o n s t r u i n gt h ep a r a m e t e r so ft h ee x p o r t e d f u n c t i o no ft h ed r i v e rd l l ,r e s e a r c h i n gt h em e t h o do f c a l l i n gt h ee x p o r t e df u n c t i o no f t h ed r i v e rd l la n d d o i n gm a n ye x p e r i m e n t s s oi tr e a l i z e st h ef u n c t i o no fc o n t r o l l i n g i n s t r u m e n t s b e s i d e st h e s et w ot e c h n o l o g i e s ,t h et h e s i sh a sa l s o c o m p l e t e d as e to fa r r a y 电子科技大学硕士学位论文 c o n t r o l l e r s a tt h es a n l et i m e ,i th a sr e a l i z e dt h ef u n c t i o no fd i s p l a y i n go ft h ea r r a y c o n t r o l l e r s ,t h ef u n c t i o no fd y n a m i c a l l yd e c l a r i n gt h ea r r a yw h i c h d i m e n s i o ni sm o r e t h a no n e ,t h ef u n c t i o no f t r a n s f e r r i n ga r r a yd a t aa m o n gt h ec o n t r o l l e r s t h i st h e s i sh a sf o u rm a i nc h a p t e r :c h a p t e ro n ei n t r o d u c e st h es i g n i f i c a t i o n ,t h e a r c h i t e c t u r e ,t h ed e v e l o p i n gt o o l a n dt h et e c h n o l o g yo ft h ep l a t f o r m ;c h a p t e rt w o d i s c u s st h er e a l i z i n gm e t h o do ft h es a v i n gf u n c t i o no ft h ep l a t f o r m ;c h a p t e rt h r e e d i s c u s st h er e a l i z i n gm e t h o do ft h ec o n t r o l l i n gi n s t r u m e n t sf u n c t i o no f t h ep l a t f o r m ; c h a p t e rf o u rd i s c u s st h er e a l i z i n gm e t h o do f t h ea r r a yc o n t r o l l e r s ;c h a p t e rf i v eg i v e s s o m ea d v i s ea n dt h i n kt oi m p r o v et h ep l a t f o r m k e y w o r d s :t h ep l a t f o r mo fa t p , s e r i a l i z a t i o n ,s a v i n gt e c h n o l o g y , i n s t r u m e n t sd r i v e r d l l v i s a i i i 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的 研究成果。具我所知,除了文中特别加以标注和致谢的地方外,论文中不包含 其他人已经发表或撰写过的研究成果,也不包含为获得电子科技大学或其它教 育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任 何贡献均已在论文中作了明确的说明并表示谓j 意。 签名:兰i 啦日期:力。卉月7 日 f 关于论文使用授权的说明 本学位论文作者完全了解电子科技大学有关保留、使用学位论文的规定, 有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅 和借阅。本人授权电子科技大学可以将学位论文的全部或部分内容编人有关数 据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。 ( 保密的学位论文在解秘后应遵守此规定) 签名:兰糸l i7 f 导师签名:颀多彳 日期:。o a 年j 具 日 电子科技大学硕士学位论文 第一章引言 1 1 研制测试软件平台的意义和价值 随着现代军用装备的现代化、高科技化和复杂化,a t e ( a u t o m a t i ct e s t e q u i p m e n t 一自动化测试设备) 的重要性同益突出,测试工作贯穿于装备系统设 计制造的整个过程。可测性设计的思想不仅体现在各国积极制定a t e 标准,而且 相应的测试维护系统逐渐从专业系统过渡到模块化、标准化的通用系统。测试维 护系统的硬件部分由系列标准的v x i 仪器模块和工作站组成,软件部分则是由 操作系统( 如w i n d o w s ,u n i x 等) ,测试软件开发平台和控制仪器模块的应用软件 及其它应用软件组成。在国外,许多著名的仪器生产商( 如安捷伦a g i l e n t ,泰 克t e k t r o n i x ,爱德万a d v a n t e s t 等) 开发了从直流、射频到微波频段的系列v x i 仪器模块并投入了市场,产品超过几千种,为集成自动测试系统提供了硬件环境。 另一方面,几个大的仪器生产商还推出了与自动测试配套的测试应用软件开发平 台,比如安捷伦公司的a g i l e n tv e ep r o ,国家仪器公司n i 的l a b v i e w , l a b w f n d o w s c v l 等,为集成自动测试系统提供了软件环境。 可以看出,硬件和软件都是组建自动测试系统必不可少的元素。最近几年, 我国已经开始认识到了自动测试在军用和民用中的重要性,并且已经启动了测试 仪器、v x i 测试模块以及测试软件开发平台的国产化进程。“v x i 总线测试软件 平台的研究”就是国产化进程中的一部分,它是总装9 5 预研项目,此研究工作 的目的就是要建立一套具有自主版权的测试软件开发平台,使用户可以在此开发 平台上方便地编制测试应用程序。 1 2 测试软件平台在国内外的研究情况 目前,国外的测试软件平台产品主要有两大类:文本编程平台和图形化编程 平台。前者如n i 公司的l a b w i n d o w s c v i ,后者如n i 公司的l a b v i e w 和a g i l e n t 公司的a g i l e n tv e ep r o 。由于这些测试程序开发平台都是商业化产品,为了维 护公司商业利益,没有相关的平台开发技术文献,而只有介绍平台应用的文献。 在国内,对此课题的研究,我们应该是唯一的研制单位。 1 3 测试软件平台的总体框架 在文本编程平台中开发测试软件,编程人员必须要有特定的编程语言基础 ( l a b w i n d o w s c v i 要求用户要有c 语言基础) ,按照编程语言规范,用文本的方 式来编制测试程序。而在图形化编程平台中开发测试程序,用户不必一定要懂得 特定的编程语言,只要知道测试流程就可以通过图形化的编程控件建立测试程 电子科技大学硕士学位论文 序。这对测试人员来说可以减轻负担,缩短测试程序的开发周期。对比两类开发 平台的优缺点,我们选择了开发图形化的编程平台。我们的测试平台总体框架可 以用以下的结构框图图1 1 表示: 图卜1 平台结构框图 1 4 测试软件平台的开发工具及相关技术 在操作系统的选择上,考虑到向下兼容和以后的升级,我们选择了w i n d o w s9 8 操作系统( 兼容w i n d o w s2 0 0 0 ) ,并在此环境下,利用v i s u a lc + + 6 0 作为本系 统的开发工具。主要基于以下几点考虑: 第一w i n d o w s9 8 作为3 2 位操作系统被广泛地使用,它继续支持8 位,1 6 位 的应用程序,具有很好的向下兼容性,可随m i c r o s o f t 公司的产品的不断升级 而发展。目前大多数的测试软件开发平台如l a b w i n d o w c v l 、l a b v i e w 、a g i l e n t v e e 等都采用w i n d o w s 系统作为操作系统平台。 第二v i s u mc 十+ 6 0 不仅提供了良好的编程环境,而且用它编写的程序代码 在速度上较快,对底层的处理也较方便,这些特点对本系统更具有重要的作用。 c + + 程序的面向对象的编程方法是编程的发展方向,其数据封装、继承机制和多 态性为我们的设计和编程提供了极好的方法。m f c 封装了大部分的w i n d o w sa p i 函数,具有强大的功能,为编程及软件的维护和升级带来极大的方便。 第三w i n d o w s 提供了丰富的图形接口,为开发图形化的环境提供了条件。 支撑平台的核心技术是面向对象( o o p ) 的编程方法、w i n d o w s 的消息驱动机 制、m f c 的消息映射机制、m f c 的文档视结构、v c + + 的文档序列化机制、w i n d o w s 电子科技大学硕士学位论文 系统对多线程的支持、w i n d o w s 系统对动态连接库的支持等。 1 5 毕业设计所完成的工作 整个测试平台的研制工作是一项浩大的工程,从平台的结构框图可以看到, 平台是由很多功能模块组成的,我的毕业设计任务是实现平台的一部分功能,它 们是: 文件存储功能的实现 仪器控制功能的实现 数组控件的实现 在本论文的以下章节,我将结合所作的工作对以上功能的实现思路和实现技 术作个总结,并在此基础上,对平台以后的改进作一些设想和建议。 电子科技大学硕士学位论文 第二章v x i 总线测试软件平台之存储功能的实现 2 1 平台对存储的需求 几乎大部分的w i n d o w s 应用程序和开发平台都提供了存储功能,用来保 存用户辛勤劳动的成果,如画图板、w o r d 、v c + + 、l a b w i n d o w s c v i 、 h pv e e 等等。应该说这些程序所需要保存的对象是不同的,文件保存的格式是 不同的,实现存储的技术也是不相同的。我们所研制的测试程序开发平台是一个 图形化的编程环境,用户可以在其上用图形化的控件编制测试程序。图形化的控 件和图形化的其它元素( 比如窗口、视图等) 就等同于文本程序中的一条条语句, 它表示了程序的特定流程和功能。下面是一个特定的测试程序,这个程序完成的 功能是:从仪器采集一正弦波的时域数据,将这批数据进行显示,然后再将这批 数据进行f f t 变换,并将频域数据显示出来。采集功能和f f t 变换分别是在一 个子程序中完成的。如图2 1 所示: 图2 - 1 测试程序的结构 从图2 1 中可以看到图形化的测试程序是由以下三大部分组成: 具有特定意义的控件。 表示控件运行关系的连线。 代表子程序的窗口。 当用户把编制的测试程序存储为文件后,应该能够在下次调出程序进行编辑或是 运行时恢复测试程序原由的外观和具有程序退出时所保存的数据。这就要求把表 征测试程序外观属性( 外观) 和运行属性( 数据) 的值保存下来。这些值包括: 电子科技大学硕士学位论文 测试程序所用到的所有控件的类,只有知道这一值,才能在恢复程序时 创建出相应的控件对象。 每一个控件的外观属性值,这包括控件的大小、位置、控件所属的子程 序( 控件在哪一个窗口中) 、控件的端口个数、端口名称、控件的名称( 标 题) 、控件的字体、颜色。 控件特有的运行数据。 连线的起始和终止位置、每一条连线所连接的是哪些控件、连线经过的 路径。 子程序的个数( 表现为窗口的个数) 、窗口的大小、位置( 包括在屏幕上 的x 、y 、z 坐标) 、窗口的标题、窗口中的控件和连线、窗口的输入端 口和输出端口。 2 2 存储所选用的技术 根据信息存储的形式的不同,存储大体可以分为:写读文件、写读数据库和 写读注册表。根据信息存储的格式的不同,存储可以分为:存纯文本信息和存 二进制流。 如果把用户编制的测试程序用一种纯文本的方式来存储的话,首先,至少我 们要构建一份能准确表示一个测试程序的纯文本信息,这一份纯文本信息必须包 括在2 1 节里所讲的一个测试程序所拥有的所有外观和运行属性值。其次,在程 序恢复时,必须解析这份庞大的信息表并生成对应的测试程序。举一个简单的 例子,当我们在解析控件的类时,我们只有这样做: 首先提取信息表中表示控件类名的信息,在这儿用s t r 表示: 然后进行判断: i f ( s t r 为“整型控件”) f 调用整型控件的构造函数,生成掩型控件对象; ) e l s e i f ( s t r 为“循环控件”) 调用循环控件的构造函数,生成循环控件对象; ) e l s e i f 一般一个测试程序会有几百个编程元素,也就是几百个对象,仅判断对象类 电子科技大学硕士学位论文 这一工作量就很大,更不用说,还有其它大量的信息需要解析,并把这些解析出 的信息体现在测试程序中。因此,用这种存储纯文本信息来保存测试程序的方法 是很麻烦的。 当然,如果需要存储程序本生来解析二进制流,那工作的难度和工作量将更 大。但是,如果选用我们所用的开发工具v i s u a lc + + m f c 中提供的序列化 ( s e r i a l i z a t i o n ) 机制的话,一切将变得容易得多。序列化机制能将对象以数据流 的形式保存在文件中,具体的实现细节都由m f c 帮助我们来完成了。我们所要 做的是设计适当的数据结构来维护我们所需要的信息。具体的实现思路和方法, 将在论文后续部分加以论述。要做好存储,就必须深入理解m f c 的序列化机制。 与应用程序主干息息相关的m f c 技术主要有: m f c 程序的初始化过程 r t t i ( r u n l i m e t y p ei n f o r m a t i o n ) 运行时类型识别 d y n a m i cc r e a t i o n 动态创建 p e r s i s t e n c e 永久保存 m e s s a g em a p p i n g 消息映射 m e s s a g er o u t i n g 消息传递 这其中,与序列化机制相关的技术包括第二、第三和第四项。所以,序列化机制 在m f c 中占有很重要的地位。接下来我将结合工作中的总结以我的理解来阐述 m f c 的序列化机制。 2 3 m f c 序列化机制 面向对象有一个术语:p e r s i s t e n c e ,意思就是把对象永久保留下来。当电源 关掉以后,什么都没有了,对象又如何能够永久保存呢? 当然是写到文件中去。 把数据写进文件,比较简单,在m f c 的d o c u m e n t v i e w 结构中,数据放在一份 文档( d o c u m e n t ) 里,我们只要把其中的成员变量依次写进文件即可。成员变 量可能是一个对象,而面对对象,我们首先应该记载其类名称,然后才是对象中 的数据。读文件就比较麻烦,当程序从文件中读到一个类名称时,他如何实现一 个对象呢? 这就需要m f c 提供的动态生成技术。存储和恢复对象的过程在m f c 中就称为序列化( s e r i a l i z a t i o n ) ,实际上就是面向对象里的p e r s i s t e n c e ( 永久生存) 。 负责这件重要任务的是m f cc o b j e e l 类中一个名为s e r i a l i z e 的虚拟函数,文件 的“读”,“写”操作均通过它。谈到s e r i a l i z e 机制,就不得不谈m f c 中的c a r c h i v e 类和动态生成技术( d y n a m i cc r e a t i o n ) 。 s e r i a l i z e 的对象( 无论写或读) 都是一个c a r c h i v e 对象,基本上你可以想象 a r c h i v e 相当于文件,不过它是文件之前的一个内存缓冲区。f r a m e w o r k 会自动的 6 电子科技大学硕士学位论文 生成一个c a r c h i v e 对象,并把它和文件相关联,然后把它作为参数,传给 c d o c m e n t 类( 文档类) 的s e r i a l i z e 函数。c a r c h i v e 类针对许多c + + 数据类型、 w i n d o w s 数据类型以及c o b j e c t 派生类,定义了o p e r a t o r ( 读入) 重载运算符。数据的读写是由c a r c h i v e 类来完成的。其中, c a r c h i v e :w r i t e o b j e c t 先把类的c r u n t i m e c l a s s 信息写出,再调用类的s e r i a l i z e 函数。c a r c h i v e :r e a d o b j e c t 的行为类似,先把类的c r u n t i m e c l a s s 信息读入, 再调用类的s e r i a l i z e 函数。 c a r c h i v e 对象之所以能把类的信息读入并动态的生成类对象是因为具有动态 生成能力的类都拥有一个c r u n t i m e c l a s s 对象( 其实是一个结构) ,并且此对象 中的一个成员指向拥有c r u n t i m e c i a s s 对象的类的c r e a t o b j e c t o l 垂i 数的指针 不为空( n u l l ) 。c r u n t i m e c l a s s 对象的结构如图2 2 所示: 类名 类的大小 类的版本号 指向类的c r e a t e o b j e c t o 数的指针 指向基类的c r u n t i m e c l a s s 对象的指针 指向下一个c r u n t i m e c l a s s 对象的指针 图2 - 2c r u n t i m e c l a s s 对象内容 各个类的c r u n t i m e c l a s s 对象构成了一个“类别型录网”,它是一个链表,各 个类的c r u n t i m e c l a s s 对象中的n l9 n e x t c l a s s 成员负责链表的连接工作。这样, 当c a r c h i v e 对象读入类的信息后,通过查这个“类别型录网”可以找到相应的 类的c r e a t o b j e c t o n i 数来动态的生成类对象,然后再调用对象的s e r i a l i z e 函数。 欲让一个对象有s e r i a l i z e 能力,它必须派生自一个可序列化( s e r i a l i z a b l e ) 类。一个类意欲成为s e r i a l i z a b l e ,必须有以下五大条件: 从m f c 的c o b j e c t 类派生下来。 类的声明部分必须有d e c l a r es e r i a l 宏。 类的实现部分必须有i m p l e m e n ts e r i a l 宏。 改写s e r i a l i z e 函数,使它能够适当地把类的成员变量写入文件中。 为此类加上一个默认构造函数( 也就是无参数的构造函数) 。因为m f c 必须先动态生成它,而且在没有任何参数的情况下调用其构造函数,然 后才从文件中读出对象数据。 m f c 的d e c l a r ed y n a m i c 宏和i m p l e m e n td y n a m i c 宏负责建立 “类别型录网”,而另外一对宏d e c l a r ed y n c r e a t e 和 电子科技大学硕士学位论文 i m p l e m e n t d y n c r e a t e则负责填上c r u n t i m e c l a s s对象的 m o f n c r e a t e o b j e c t 指针,支持动态生成。s e r i a l i z a b l e 五大条件中的 d e c l a r es e r i a l 和i m p l e m e n ts e r i a l 宏则包含了上述的两对宏,并负 责填上c r u n t i m e c l a s s 对象的m w s h e m a 成员,当然还有其他一些功能。因此, 当类有了d e c l a r es e r i a l 和i m p l e m e n ts e l l i r a l 宏以后,就能够在“类 别型录网”上注册,并具有动态生成能力,支持存储功能。 2 4 m f c 的文档视结构及应用程序的存储过程 有很多的理由需要了解m f c 的文档视结构,最重要的一点是,我们所研制 的测试软件平台就是一个基于m d i ( 多文档多视) 的文档视结构应用程序。针对 存储来说,了解文档视结构的理由主要有三点: 首先,只有在文档视结构中才能应用序列化机制( s e r i a l i z a t i o n ) ; 其次,我们需要知道是怎样把视图中所见到的一个个窗口对象的数据通 过文档序列化写到磁盘文件中的,数据和视图是怎样分离和联系的; 第三,我们需要知道,当打开一个磁盘上的测试程序文件时,以下过程 是怎样产生的以及它们的先后顺序:产生测试程序的窗口( f r a m e ) 和视 ( v i e w ) 、将视中所要显示的所有控件窗口及连线窗口的对象数据通过序 列化机制从文件中读出、将控件窗口和连线窗口显示在测试程序的视 ( v i e w ) 中。 2 4 1m f c 的文档,视结构 文档视结构与应用程序框架紧密相连,在这个框架中定义了键盘加速键、菜 单命令处理与消息的分发和控制。采用文档视结构的应用程序至少应由以下对 象组成: 应用程序是一个c w i n a p p 派生对象,它充当全部应用程序的容器。应用 程序沿消息映射网络分配消息给它的所有子程序; 框架窗口是一c f r m e w n d 派生对象; 文档是一个c d o c u m e n t 派生对象,它存储应用程序的数据,并把这些信 息提供给应用程序的其余部分; 视窗是c v i e w 派生对象。它接受用户在应用程序中的输入并显示相关联 的文档数据: 在文档视方式中,文档是可以表现应用程序使用的数据集的抽象术语,用称 为d o c u m e n t 的独立数据对象表示。而用户输入处理及图形输出功能从框架窗口 转向视图,程序的输出必须通过视图。c d o c u r n e n t 类对文档的建立及归档提供支 持并提供应用程序用于控制其数据的接口,这样使应用程序保持数据独立。m d i 电子科技大学硕士学位论文 应用程序可以处理多个类型的文档,每个类型的文档拥有一个相关联的文档模板 对象。文档对象驻留在场景后面,提供由视图对象显示的信息。文档至少有一个 相关联的视图。视图只能与一个文档相关联。 在文档视方式中,对象的建立是由文档模板来管理的,它是c d o c t e m p l a t e 派生对象,应用程序c w i r t a p p 对象拥有并控制文档模板,后者产生文档、框架 窗口及视窗。文档与视之间有指针相连,几者之间的关系可以用图2 - 3 来表示: 子框架窗口 c m d l c h i l d w 刮c m u l t i d o 模c t e m 警pp f。 i 裂惶 上建 主 、 c 框架m d i f r a 帅m d l f r a m e wi 文档对象 c d o c u m e n 视对象 图2 - 3 文档视结构中各元素间的关系 2 4 2 存储过程 存储应该包括两大方面的内容:保存现场( 写数据) 和恢复现场( 读数据并 创建窗口) 。 保护现场的过程比较简单,只要我们能在用来保存数据的文档中设计出适当 的数据结构,并且它能准确的表示视图中所见到的东西,然后利用文档序列化机 制把这些数据结构写到磁盘中即可。 恢复现场的过程就比较复杂,因为它除了要用到动态创建的技术来恢复对象 外,并且要创建窗口( f r a m e ) 、视( v i e w ) ,还要准确地创建出需要在视中显示 的所有编程控件窗口及连线窗口。这一复杂的过程都是由上面提到的文档模板 ( c d o c t e m p l a t e ) 来调度的,其过程如下: 打开文件( 恢复现场) 是通过命令c w i n a p p :o n f i l e o p e n 来执行的,它的核 心操作是调用c d o c t e m p l a t :o p e n d o c m e n t f i l e ,其原形为: v i r t u a lc d o c u m e n t * o p e n d o c u m e n t f i l e ( l p c t s t r p s z p a t h n a m e ,b o o l b m a k e v i s i b l e = t r u e ) = o ; 该函数的流程是: 第一步c d o c t e m p l a t e :c r e a t e n e w d o c u m e n t 函数创建一个新文档,其类型 与文档模板相关,并通过函数c d o c t e m p l a t e :a d d d o c u m e n t 加入该文档 模板的文档指针列表中。此时,文档类的构造函数被执行,程序可以在 此进行文档的初始化。 第二步函数c d o c t e m p l a t e :c r e a t e n e w f r a m e 调用m d i 子窗口类 电子科技大学硕士学位论文 f c m d i c h i l d w n d ) 的构造函数,生成m d i 子窗口对象。接着调用 c m d i c h i l d w n d :p r e c r e a t e w i n d o w 。然后,生成一个c c r e a t e c o n t e x t 对象, ( c c r e a t e c o n t e x t 是m f c 框架所使用的一种结构,它将构成文档和视的 组件联系起来。) 并将该对象值传给c m d i c h i l d w n d :o n c r e a t e c l i e n t 函数。 m f c 调用此函数,用c c r e a t e c o n t e x t 对象提供的信息创建一个或多个 c v i e w 对象。此时,各视的构造函数被依次调用。 第三步判断l p s z p a t h n a m e 是否为空。分为两种情况: ( a ) 、若为空,则表明要创建一个新文档:调用s e t d e f a u l t t i t l e 函数装 载文档的缺省标题,并显示在文档的标题栏中:然后执行 c d o c u m e n t :o n n e w d o c u m e n t 。该函数调用d e l e t e c o n t e n t s 以保证文档为 空,然后置新文档为清洁。可以重载该函数。 ( b ) 、否则,表明要打开一个已存在的文档:调用 c d o c u m e n t :o n o d e n d o c u m e n t 打开指定的文件;执行d e l e t e c o n t e x t ,保 证文档为空:调用c d o c :s e r i a l i z e 读入该文件的内容:( 程序员可在此 进行文件的读入操作) 然后置文档为清洁;最后,调用 c d o c t e m p l a t e :s e t p a t h n a m e ,并把文件名加入到最近文件列表中。 第四步调用c d o e t e m p l a t e :i n i t i a l u p d a t e f r a m e 函数,使框架窗口中的各 个视收到o n l n i t i a l u p d a t e 调用。框架窗口的主视( 子窗i d 等于 a f xi d wp a n ef i r s t 的视) 被激活。程序员可以在此对视对象进行 初始化。 通过以上的分析,我们已经知道,在文档视方式中,文档和视是分离的,即: 文档用于保存数据,而视用来显示这些数据。文档模板维护它们之间的关系。并 且也知道了整个存储的过程。现在,我们就可以在文档中建立适当的数据结构, 用来保存视中所见到的所有东西,在保存文件的时候通过序列化把这些数据结构 写入磁盘;另外,读文件的时候,当文档模板把文档对象、m d i 窗口对象、视 对象产生以后,通过文档对象的s e r i a l i z e 函数把对象数据从磁盘中读出。然后, 在文档模板初始化框架窗口的主视的时候,我们在c v i e w :o n l n i t i a l u p d a t e 函数 中通过序列化出来的对象数据来产生对象窗口,从而恢复视窗中的所有东西。 2 5 存储的实现 2 5 1 测试程序的结构分析 前面已经谈到过,我们的平台是基于m f cm d i ( 多档多视) 的文档视结构 的应用程序。从测试程序的结构图图2 1 中也可以看到,测试程序包含了很多代 表子程序的子窗口。每一个窗口中又有许多的编程控件和连线。总的来说,存储 l o 电子科技大学硕士学位论文 的主体有三种:控件、连线和窗口。控件、连线在我们的平台中被抽象为两个类, 分别是c b a s e ( 控件基类) 和c l i n e ( 连线类) 。子程序窗口在我们的平台中代表 着一个子程序,它和一个特殊的控件c u s e r o b j e c t ( 基类是c b a s e ) 相关联,子 窗口是通过双击c u s e r o b j e c t 控件而产生的,所以,可以说子窗口和控件存在着 一定的联系。在平台的开发中,测试程序的子程序窗口是由一个m f c 的m d i 子窗口( c m d i c h i l d w n d 类) 实现的。每一个m d i 子窗口的视都对应了一个文 档类( c d o c u m e n t 类) ,所以每一个m d i 子窗口中的内容都可以通过其视所对应 的文档进行序列化存储。这也是m d i 应用程序的默认存储方法( 它总是将应用 程序中活动的视所对应的文档进行序列化存储) 。如果按这种默认的方法进行存 储,由于用户在我们的平台中开发的一个测试程序中可能会有几百甚至几千个子 程序( 子窗口) ,所以,一个测试程序就要用几百甚至几千个文件来保存。这种 方法显然是不可取的。 这里就出现了一个问题:怎样才能用一个文件( 通过对一个文档进行序列化 存储) 就把本来需要用很多文件( 多个文档序列化) 才能保存的多个文档的数据 保存下来呢? 这就需要在测试程序的主窗口( 主程序对应的窗口) 的视所对应的文档中构 建一种数据结构,使我们能够通过对它的序列化存储来完成对整个测试程序的序 列化存储。要构建这么一个数据结构,我们首先必须知道,什么样的数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论