LabVIEW面向对象的ActorFramework(3)
四、LabVIEW面向对象的编程架构:Actor Framework
Actor Framework是一个软件类库,用以支持编写有多个VI独立运行且相互间可通信的应用程序,在该类型应用程序中,每个VI即代表操作者(Actors)执行独立的系统任务,操作者本身维持着自己的内部状态,并传递消息给其它的操作者,在LabVIEW编程环境中已经有了一些创建此类架构程序的技术存在,而操作者框架则聚焦于容易学习(相对于其它可能强大的工具而言),够降低死锁和竞争条件,并拥有最大限度代码复用的优点。
加载ActorFramework4.1.0,可以看到当前框架的基本结构,主要父类有Actor和Message,及Message队列类、出入队列类、优先级操作类。
Actor:拥有数据状态的模块。
Message:消息在操作者间传递用来触发状态改变。
在NI官方资料中,介绍操作者框架(ActorFramework)是在广泛应用的队列驱动状态机(QDSM)的基础上开发而成,但更优于DSDM的框架。
现在用官网的QDSM和ActorFramework的程序图做一下比较,能够很直观的看出两者的程序简洁性,如下图所示:
QDSM
ActorFramework
可以看到,使用操作者框架后,整个程序非常简洁,队列驱动状态机的簇和相关代码封装成类和方法,消息和条件结构封装为类和动态匹配。当接收到消息时,Actor的方法就自动运行。
使用ActorFramework,如果新增加类似功能,只需要继承类后,再进行类方法的修改并重载、新建类的独有方法,而不需要修改主框架,就可以完成新功能的添加。而如果使用QDSM,则需要增加单独队列才能完成。
五、范例一
下面以消费者来商店购买东西的场景,完成一个ActorFramework的基本开发过程的演示。
(1)新建一个空白项目。
(2)添加一个Actor,CustomerA
(3)添加第二个Actor,ShopAssistant
(4)新建launch.vi,作为调用主程序,添加类启动
(5)新建静态VI,保存为AskMessage,程序增加对话框,然后创建消息
(6)在主程序中添加消息响应函数
(7)运行Launch.vi,当点击按钮时,弹出的对话框。说明成功调用AskMessage.vi。
(8)CustomerA询问啤酒价格,ShopAssistant需要有对应的反馈。在ShopAssistant类里面增加函数ShopAssistant,当调用时,弹出对话框。最后,创建消息。
(9)CustomerA询问的消息需要传递给ShopAssistant,需要修改类私有数据的簇的数据引用类型,添加ShopAssistant的队列引用。
(10)添加数据成员访问函数,将ShopAssistant的消息队列加载进来
(11)修改CustomerA类的函数,增加入队队列,调用ShopAssistant消息响应函数
(12)修改Launch.vi,将ShopAssistant队列传递进去,运行后,弹出两个对话框,即完成了一个Customer与ShopAssistant的对话。
(12)如果CustomerA对ShopAssistant的回复再进行回复,我们仅仅需要在CustomerA类里面添加方法CustomerAFeedBack,创建消息。然后,在ShopAssistant类里面添加消息响应。
(13)运行Launch.vi,首先弹出两个对话,点击确认时,弹出“非常感谢”,证明程序调用成功。
综上,是一个非常简单的基于ActorFramework编写的购买东西的场景需求。可以看到,在需求增加的过程中,我们对主界面程序Launch.vi很少有变动修改,大部分的需求增加,都是修改增加对应类中的函数完成,这在中、大型程序的编写中会有很高的编码生产效率。
LabVIEW面向对象的ActorFramework(3)的更多相关文章
- LabVIEW面向对象的ActorFramework(2)
二.为什么要学习面向编程? 面向对象编程,如果将上文推荐的两本书读完后,基本上也就有了答案.从自我产品开发的经验中,理解为可以迅速解决中大型程序需求变化时,在不影响其他程序功能的情况下,能够实现新增功 ...
- LabVIEW面向对象的ActorFramework(1)
本系列文章主要阐述以下几个问题: (1)什么是面向对象编程? (2)为什么要学习面向编程? (3)LabVIEW面向编程学习为什么有点难? (4)LabVIEW面向对象的编程架构:Actor Fram ...
- 用C++写程序的一些感悟
前言 近期使用C++有了一些心得很感悟,这里整理一下. 心得1 如果只会使用LabVIEW写程序,还想要进一步深入程序设计,一定要学习一门文本语言. 什么是会用LabVIEW 会用是个比较笼统的概念. ...
- [LabVIEW架构]ActorFramework(一)
前言 小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了. 近期小黑将与大家一起认识一下ActorFramework,既是对自己一段时间写AF程序的总结,也是梳理, ...
- [LabVIEW架构]ActorFramework(二)
前言 在上一个文章中,我们介绍了一下LabVIEW中AF的基本概念,本讲将以上一次的例子来讲解LabVIEW中的实现 正文 范例说明 假定两个人,一个作为老师,一个作为学生.学生每天早上给老师发送一封 ...
- 【LabVIEW技巧】LabVIEW OOP怎么学
前言 有很多人对LabVIEW OOP存在比较极端的看法,大致分为两类: 1. 绝对否定派认为LabVIEW OOP只不过是LabVIEW为了追求时髦,在面向过程的基础上用簇做了一些特性,实际上完全不 ...
- ActorFramework教程对比及规划
牢骚太盛防肠断,风物长宜放眼量. 一.引子 昨天的文章,本来就是想写写ActorFramework的教程内容,结果写着写着偏了,变成了吐槽. 首先,声明一下,自己从未参加过任何LabVIEW培训班,也 ...
- 有哪些LabVIEW快捷键让你相见恨晚
前言 任何一门工具,当你使用它到极致的时候,往往都朝着这样子的两个方向发展 1. 具有鼠标操作功能的软件,他的使用的极致就是脱离鼠标,迈向键盘 2. 主要是键盘操作的,他的极致就是脚本自动化,或者说一 ...
- LabVIEW类方法浏览器-Class Method Browser
随着LabVIEW的类编程应用增多,当打开较多的VI进行编辑时候,添加该类对应的VI方法到程序后背板上操作显得繁琐(需要在Project浏览器或类浏览器或库浏览器中找到该类的方法VI,然后再拖到程序背 ...
随机推荐
- HDU5943 Kingdom of Obsession 题解
题意 有 \(n\) 个数 \(s+1\ldots s+n\),求是否能将这 \(n\) 个数放到 \(1\ldots n\) 上,且当令原数为 \(x\),放到 \(y\) 位置时有 \(x \mo ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:内嵌下拉菜单的按钮组
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 2017北京网络赛 F Secret Poems 蛇形回路输出
#1632 : Secret Poems 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – ...
- Maven是什么,如何使用Maven
一.简单的小问题? 1.1.假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之 ...
- java 寒假作业
寒假作业 现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ (如果显示不出来,可以参见[图1.jpg]) 每个方 ...
- 011.CI4框架CodeIgniter, 获取查看用户的IP地址和浏览器信息
01.PHP CI4框架CodeIgniter中有Request 类,是用来读取各种用户的数据,其中获取IP地址的代码如下: <?php namespace App\Controllers; c ...
- List<Object> 查询解析优化
2018年3月16日 大型仪器设备分类查出后,需要展示个分类下总共有多少台设备.因为分类总共分三层,加起来数据700+.以后该系统上线设备可能达到2000+,这样统计每个分类下的设备可能会拖垮服务器. ...
- CSS样式表——样式2
样式 5)边界边框 margin:0px; //外边距为0 margin:10px 0px 0px 10px; ...
- C++学习记录——(queue的清空)
c++自带的queue并没有clear这个方法:所以只能自己写了. 一共三种(其实我决得就是两种): 第一种: 直接赋值 queue<int> MyQue; /* …… */ MyQue ...
- POJ2392:Space Elevator
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9244 Accepted: 4388 De ...