程序结构设计_第1页
程序结构设计_第2页
程序结构设计_第3页
程序结构设计_第4页
程序结构设计_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

智能仪器技术应用程序框架和设计模式什么是设计模式?一种LabVIEW程序模板与架构

软件实践中通用的程序架构,其本质是对很多十分类似的问题进行总结归纳的基础上提炼出的一些具有代表性的软件开发规范具有灵活的配置功能被广泛使用使用设计模式的益处简化整个开发过程更容易理解程序代码代码可重用可靠性被使用多年,被证明其“可用并可靠”大量技术资源与例程使用设计模式注意事项1、不是一成不变的定律,既要知道有哪些设计模式,还要知道每种模式解决实际应用中的哪些问题,是如何解决的,效果如何?2、文本式编程语言中广泛使用的设计模式在图形化数据流编程中的应用问题。注意!有些时候你没有必要选用最复杂的设计模式不要忘记最常见的设计模式——数据流!通用型:状态机模式、

消息队列模式、

用户界面事件模式专用型:主从线程模式、

生产/消费模式、

后台服务模式、 应用程序启动模式、

代理模式LabVIEW设计模式

本讲内容应用程序框架和设计模式1.2.3.4.基于循环和分支结构的程序框架基于事件结构的程序框架标准状态机生产者/消费者设计模式本讲内容本讲讨论的问题如何建立一个具有一定规模的完整应用程序•

应用程序框架和设计模式应用程序框架(ApplicationFramework)?

供软件开发者使用的用以实现特定编程环境下应用程序标准结构的软件框架;例如微软VisualC++中包含的MFC框架(不仅仅是函数库,还包含程序框架);

应用程序框架是根据大量的研发经验总结出的一套切实可行的应用程序建立模型。降低开发难度,提高程序的健壮性;需要投入一定的时间学习其使用方法;

编写小程序时不需要对程序框架有很清楚的概念;编写具有一定规模的程序时,使用一个好的程序框架显得非常重要。•

应用程序框架和设计模式设计模式(DesignPattern)?

设计模式是针对软件设计中经常发生的问题的通用的和可重用的解决方案。它是对如何解决一个问题的描述或模板,可以在多种不同场合下使用。 在LabVIEW中,设计模式是解决常见软件设计问题的VI结构。设计模式一般以模板的形式出现,其目的为提高重用性、编程效率和质量。 (LabVIEWStyleBook)•

应用程序框架和设计模式设计模式?

设计模式促进了好的编程样式。如果一个应用程序中的所有VI都应用了常用的设计模式,那么开发者们就可以很容易地识别、理解、维护和重用彼此的程序代码。设计模式容易制作成模板,构建程序时经常可以从模板开始,按照自己的需求修改模板,而不是总是从头建立程序。这样将节约很多开发时间,并且确保所开发的所有VI结构一致。在一个多个开发者协作的组织中,设计模式和模板有助于建立统一的标准,以确保整个组织的所有成员所研发软件具有一致的高质量。•

应用程序框架和设计模式应用程序框架vs.设计模式

设计模式包括解决各种软件问题的通用方案,其范围广阔;应用程序框架仅针对“应用程序如何架构”这一具体问题。

设计模式程序框架设计模式解决其他问题的设计模式

1.基于循环和分支结构的程序框架轮询(Polling)

在循环结构中不断查询控件的状态,一旦判定发生用户事件(例如按下一个按钮)则执行相应的代码。轮询常用于按钮按下操作的响应。例1:响应按下按钮操作(轮询)用户界面事件模式“我需要轮询用户的操作,但是这样会降低我程序的运行速度,并且有时我还检测不到……”1.基于循环和分支结构的程序框架

按钮的“机械动作”—“释放时触发”:用户按下按钮后控件的值为真,在程序框图上读取该控件的真值之后,按钮控件会自动弹起,恢复值为假,即一次按钮按下操作只会引起程序读取到一次真值;

等待函数的作用:决定循环执行频率/轮询频率(100毫秒为典型值);使用Windows的任务管理器,观察有等待函数和没有等待函数两种情况下CPU的占用情况。例2:统计循环次数和按下按钮次数(轮询)如果去掉等待函数则“循环执行次数”控件值很大,占用较多CPU资源1.基于循环和分支结构的程序框架移位寄存器初始化为0,用于存储”确定“按钮按下次数移位寄存器的值每次循环都送入“确定按钮按下次数”控件“确定按钮”按下时移位寄存器值加1存储循环执行次数

1.基于循环和分支结构的程序框架例3:生成波形和分析波形(轮询)

自由游标

按下“生成波形”按钮生成指定波形,之后按下“分析波形”按钮求取波形的最大值和对应x索引,将游标移动到最大值点1.基于循环和分支结构的程序框架2.基于事件结构的程序框架事件结构+While循环

图形化操作系统和应用程序采用事件驱动的编程机制。程序开始后进入等待状态,等待某个事件发生后进入相应处理代码,处理结束后回到等待状态。以下代码中,用户要求结束程序运行(按下“停止”按钮)时,退出事件结构,结束While循环,停止程序运行。

2.基于事件结构的程序框架例4:响应按下按钮操作(事件结构)

2.基于事件结构的程序框架例5:统计循环次数和按下按钮次数(事件结构)

2.基于事件结构的程序框架例6:生成波形和分析波形(事件结构)两个按钮输入控件置于事件结构内“停止”:值改变事件分支未给出初始化代码,最先执行状态机模式“我需要执行一系列的事件步骤,但是步骤顺序可通过编程决定的。”3.标准状态机标准状态机(StandardStateMachine)自动贩卖机模型InitializeWaitChangeQuarterDimeNickelExitVendNoinputQuarterDepositedTotal<50Total>=50ChangeRequestedDimeDepositedNickelDepositedTotal<50Total<50Total>=50Total>=50Total>50Total=50基本三要素:状态、事件、动作背景动态结构:允许不同的状态,按通过编程决定的顺序进行执行静态顺序结构状态机结构对于一个最简单的状态机结构而言,它是可以用顺序结构代替的;而对于相对复杂的状态机结构而言,却可以作为测试流程的组织者和管理者。在LabVIEW下实现状态机结构While循环+Case结构每一Case即为一个状态当前状态中需有决定下一状态的判定代码使用枚举常量通过移位寄存器传递至下一状态切换代码工作流程初始状态FIRSTSTATE下一状态

执行步骤移位寄存器用于传递状态Case结构对每一状态都配备一个分支切换代码根据执行步骤中的结果来决定下一状态枚举常量

一个自定义的枚举类型对应一个状态机中的状态集合枚举常量枚举类型是一种允许程序员自定义元素的数据类型,它可以显示数值对应的具体含义,帮助程序员理解程序中使用的变量值。枚举常量举例控件选板“Modern”

1、枚举控件、指示、常量

2、默认U16

3、修改EditItems

4、隐式与显式类型转换3.标准态机新建对话框,VI->基于模板->框架->设计模式->标准状态机3.标准状态机使用什么数据类型表示状态机的状态? 分支/条件结构选择器端子可接受数据类型:布尔(此处不适用),整数,字符串,枚举……1.整数:不够直观,分支选择器接入的变量意义不清楚;2.字符串:意义明确,但容易出现拼写错误,引起程序执行错误;解决办法:建立可容纳所有拼写错误字符串的默认分支,弹出对话框警告自己;3.枚举:意义明确,不易出现错误。①在前面板添加枚举控件,在快“自定义类型”,保存自定义类捷菜单选择高级->自定义…

3.标准状态机建立和使用自定义枚举类型

②编辑自定义枚举类型所包含的 枚举值,“控件类型”列表选择

型控件(.ctl)在状态机中使用自定义枚举类型,类型定义改变时,所有实例自动更新③在框图窗口函数选板,“SelectaVI…”,选择已保存自定义控件④在框图窗口添加自定义枚举类型的常量3.标准状态机3.标准状态机3.标准状态机等待状态中,检查三个按钮控件的值,如果找到真值则进入对应状态,否则回到等待状态

初始化后立刻进入等待状态检查三个按钮控件值的方法:建立布尔类型1维数组,查找真值,从输出索引值判断有(索引≥0)无(索引=-1)真值和有真值时真值的位置。有真值时,索引值+2,之后类型转化为枚举值等待函数,降低查询按钮值时的CPU负荷

3.标准状态机例7:生成波形和分析波形(标准状态机)3.标准状态机生成波形后,回到等待状态分析波形后,回到等待状态Stop状态下退出循环,结束程序运行

3.标准状态机例8:生成波形和分析波形(带事件结构的状态机)

其他模式“我希望同一时刻能够处理多个消息事件,而不是下一个消息代码必须等待上一次响应完成后才能执行”“我不希望消息排队,等待很烦的,有时采集数据和记录数据应该同时进行的”。主从线程模式通常应用于具有多个同时发生的并且拥有不同运行速率的线程的程序中。比如采集电压同时写入磁盘,采集速率1KHz,记录则每5秒一次。1、数据通信采用全局变量、局域变量或共享变量;2、Stop为Switch模式3、有时会用到事件发生模块Occurrence生产者/消费者“我需要可以同时间执行的两个过程,并且需保证它们不会互相影响执行速度。”生产者/消费者全局变量、局域变量或共享变量的每次复制都是原始数据的一个副本,占据了大量的空间。实际上只需要使用一部分缓冲区作为数据存储的中间部分,这需要借助队列技术。存储单元数据流入数据流出生产者/消费者具体做法最简单模式在LabVIEW下实现生产者/消费者无数据相关的多个循环主/从关系在循环间实现通讯与同步工作流程主循环负责通知各个从循环是否执行允许循环间异步执行数据的非相关性实现多线程程序过程分解从循环1从循环2主循环实现循环间的数据通讯变量通知器队列信号量集合队列在队列中添加元素从队列中释放元素Referencetoexistingqueueinmemory选择队列中元素的数据类型出列操作需要等待数据进入或者超时情况生产者/消费者循环后台服务模式问:“我需要程序在后台运行,不要前面板,不要交互”答:“采用VI属性和方法接口,足以使你控制后台运行的VI”

例子:一个网络服务监听程序,程序只需要接收与客户端Sockets的连接,实现三次握手,连接完成后将引用交给前端应用程序处理,同时继续监听。后台服务模式后台服务模式

4.生产者/消费者设计模式队列(Queue)

一种特殊的数据结构;是按顺序存储的数据的集合,对于集合的主要操作是在集合尾部加入数据和从集合头部移除数据;FIFO(First-In-First-Out)。

4.生产者/消费者设计模式

4.生产者/消费者设计模式队列典型函数,函数选板,编程->同步->队列操作1.获取队列引用(ObtainQueue)

功能:获得队列的引用。默认情况下,如果指定队列已存在,获得该队列的引用;如果队列未存在,则创建队列。可以在程序的不同部分引用同一个队列,即在两端代码之间共享和传递数据。

4.生产者/消费者设计模式2.元素入队列(EnqueueElement)3.元素出队列(DequeueElement)4.预览队列元素(PreviewQueueElement)功能:返回队列头元素,但不删除元素。5.获取队列状态(GetQueueStatus)功能:返回队列状态信息,如元素个数。-1(默认)时永远等待4.生产者/消费者设计模式6.队列最前端插入元素(EnqueueElementAtOppositeEnd)功能:在队列头插入元素(非标准操作,用于插入高优先级元素)。7.清空队列(FlushQueue)功能:清空队列所有元素(并返回这些元素)。8.释放队列引用(ReleaseQueue)功能:释放队列的一个引用。

4.生产者/消费者设计模式例9:队列操作示例入队列两个元素预览/观察队列头元素预览操作不会删除队列元素在队列头插入元素队列头元素出队列生产者,生产数据消费者,消费/使用数据数据

4.生产者/消费者设计模式什么是生产者/消费者设计模式(Producer/Consumerdesignpattern)?

两个线程,一个生产数据,另一个消费/使用数据;在线程之间建立缓冲(采用队列实现),确保消费者以自己的步调使用数据,同时允许生产者将更多的数据添加到队列中。

缓冲区(基于队列,已填充一部分)

4.生产者/消费者设计模式消费者循环,从缓冲取出数据消费者循环,从缓冲取出数据使用队列建立生产者和消费者之间的数据缓冲

4.生产者/消费者设计模式新建对话框,VI->基于模板->框架->设计模式->生产者/消费者设计模式(数据)

生产者循环, 向缓冲加入数 据,入队列 通过轮询决定何时入队列消费者循环,从缓冲取出数据使用队列建立生产者和消费者之间的数据缓冲

4.生产者/消费者设计模式新建对话框,VI->基于模板->框架->设计模式->生产者/消费者设计模式(事件)

生产者循环, 向缓冲加入数 据,入队列 通过事件结构入队列消费者循环,从缓冲取出数据初始化代码

4.生产者/消费者设计模式

例10:生成波形和分析波形(生产者/消费者)

用事件结构将动作/

操作入队列“Initialize”首先入队列4.生产者/消费者设计模式

用事件结构将动作/

操作入队列在消费者循环内,执行相应动作

4.生产者/消费者设计模式自定义枚举类型,包含7个状态采用属性节点,指示灯位置初始化到(0,0)首先进入初始化状态

4.生产者/消费者设计模式每隔100毫秒产生超时事件 入队列出队列 人为添加消费者 数据处理延时两个循环都结束才释放队列/china/labviewtips应用程序启动模式“我想设计一个启动画面,同时显示应用程序加载的进度,加载完毕后退出启动画面,运行主程序”应用程序启动模式1、SubVI目录

2、启动应用程序.vi

3、主程序“网络实验系统.vi”代理模式“我希望顶层VI(主VI)需要某个子VI时,才将其载入内存”“可以在应用程序中引入迟载入技术”代理模式总结设计模式简化LabVIEW开发过程被广泛使用及证明其可用常用的LabVIEW设计模式数据流事件驱动状态机结构生产者/消费者

属性节点属性节点(Pr

温馨提示

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

评论

0/150

提交评论