labview学习——生产者/消费者(数据)(事件)
其主要的模型:

主要从以下几个方面理解:
1、可重入性
正常的labview是多线程设计语言,而我们在执行VI时的规则是通过VI的命名来分别调用实现的。
打开VI的Highlight调试工具,可以看出两个Wait.vi实例的调用并不是同时执行的,而是依次按顺序执行的,至于哪一个实例先执行是不确定的。这是由于LabVIEW本身是并行设计的,从理论上而言,两个VI的实例是同步执行的,但是如果两个Wait.vi实例同时执行必定会产生参数赋值紊乱,因为LabVIEW只允许内存中存在一个名称的VI。
如果在一个顺序结构里要同时进行两个vi的调用,采用的方法是单击ctrl+I,在新点出来的对话框中选择执行框里边的可重入选择Reentrant execution,这样的话再次运行上述实例用时长为并行执行的时间。事实上,LabVIEW的可重入技术相当于在原有VI的基础上产生了一个相同的副本,打开Wait.vi从标题栏可以看出VI的名称为Wait.vi:1(clone)。同理这是由于LabVIEW中不允许内存中的VI存在同名,VI的可重入技术相当于产生了与原VI具有同样功能的新VI并且修改了该VI的命名。
在实际应用中,需要根据情况决定是否设置VI的可重入属性,灵活使用。并不是需要将所有的VI都设置为可重入,那将占据大量的内存资源。
2、动态调用
通常调用子VI有两种方法,一种是静态调用,直接在控制板里选择子VI的方法,即编译生成可执行程序后,子VI的代码将会被静态链接到可执行程序中
另一种就是动态调用,指的是通过程序调用另一个程序的运行、停止、赋值和获取值。通过程序框图-查看(菜单)-函数-编程-应用程序控制-通过引用调用,通过VI引用动态调用,可以保证VI在需要时才被装入内存,与静态调用相比节约了内存资源。
labview有多种动态调用的方式,从底层而言采用的是VI Server技术来实现的。
如果VI调用程序较大,采用动态加载VI的方式可以节省加载时间和内存,这是因为在调用程序需要运行该VI以前无需将其加载,在操作结束后又可将其从内存中释放。VI调用配置对话框可用来配置何时加载子VI。
一个简单的实例:

- 指向严格类型引用句柄的VI仅提供连线板信息
- 不要混淆选择VI连接板与获取VI引用句柄这两项的不同操作
我结合可重用性和动态调用的特性,做了以下实例练习,即实现斐波那契数列(Fibonacci数列)。斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21„„ 这个数列从第三项开始,每一项都等于前两项之和。在数学上表述为:f(n)=f(n-1)+f(n-2),其中n>=3,f(1)=f(2)=1。 n<2,fn=1;n>2 ,fn=f(n-1)+f(n-2);
VI本身是有很多的属性和方法的,如图 35所示。使用这些方法就可以动态控制VI的运行、停止和赋值,各个属性节点和方法的具体含义见LabVIEW的帮助文档。使用这种方式动态调用VI时,并不需要知道VI的输入输出接口。
3、循环
我们可以使用“多循环”来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。这里就用到了我们常说的队列函数,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。
在LabVIEW的队列操作中(入列和出列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。当数据溢出时,入列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,出列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。
实例介绍生产者消费者循环的基本特性以及队列操作的特点:
例程提供了操作方式控件控制生产者和消费者的数据传递速率,包含五种状态:不生产只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只生产不消费。
代码包括三个循环,分别是生产者循环,消费者循环,状态循环

将生产者的【枚举+条件结构】改成【枚举+事件结构】,即变成了消费者生产者(事件模式);
对应的前面板显示如
实际中应该避免由于timeout(超时)设置为-1而导致的无限等待和死循环。
4、扩展
采用一个计算机组件测试的实例来简单介绍;
其中的主要思想是:结合状态机模式、事件结构和动态调用技术,能够归纳出针对较复杂应用程序的通用设计模式。对常见的测试测量程序而言,主要由数据采集、数据分析、外围菜单项响应、报表生成、数据显示这五个部分组成。其中数据采集是相对独立和长时间运行的一个模块,可以与其它的模块同时运行。因此,在大多数持续采集的程序设计中需要将它单独作为一个模块运行。与此同时,子程序也需要一条数据通道发送一些反馈命令给主程序。于是可以构成如图所示的一个通讯回路。

labview学习——生产者/消费者(数据)(事件)的更多相关文章
- LabVIEW之生产者/消费者模式--队列操作 彭会锋
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- LabVIEW之生产者/消费者模式--队列操作
LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...
- LabVIEW之生产者/消费者模式
LabVIEW之生产者/消费者设计模式 彭会锋
- JAVA多线程学习--生产者消费者问题
一.问题描述 生产者消费者问题是一个典型的线程同步问题.生产者生产商品放到容器中,容器有一定的容量(只能顺序放,先放后拿),消费者消费商品,当容器满了后,生产者等待,当容器为空时,消费者等待.当生产者 ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
进程同步: 1. 锁 (重点) 锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...
- python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))
昨日内容回顾 python中启动子进程并发编程并发 :多段程序看起来是同时运行的ftp 网盘不支持并发socketserver 多进程 并发异步 两个进程 分别做不同的事情 创建新进程join :阻塞 ...
- python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
(1)锁:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 虽然使用加锁的形式实现了 ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
随机推荐
- CMake命令之export
CMake中与export()相关的命令 (注:红色字体是标题,粉色是需要特别需要注意的地方) 总的来说,export()命令想要做的事情可以用一句话概括:Export targets from th ...
- WINSCP 使用笔记
前期准备: 1.官网下载:http://winscp.net/eng/docs/lang:chs 官网C#示例:http://winscp.net/eng/docs/library#csharp 当然 ...
- java 中static关键字注意事项
1.内存中存放的位置:(static修饰的方法和属性保存在方法区中,但是方法区也是堆的一部分) 内存的分区 2.什么样的属性可以定义为静态数据 例如: class person{ public Str ...
- P2P平台爆雷不断到底是谁的过错?
早在此前,范伟曾经在春晚上留下一句经典台词,"防不胜防啊".而将这句台词用在当下的P2P行业,似乎最合适不过了.就在这个炎热夏季,P2P行业却迎来最冷冽的寒冬. 引发爆雷潮的众多P ...
- 十大经典排序算法(Javascript实现)
前言 总括: 本文结合动图详细讲述了十大经典排序算法用Javascript实现的过程. 原文博客地址:十大经典排序算法 公众号:「菜鸟学前端」,回复「666」,获取一揽子前端技术书籍 人生有情泪沾衣, ...
- jquery.timepicker.js - 最常用的日期JS控件
客户提了个需求,输入日期,想也不用想,立刻翻查Jquery,发现是有timepicker.js这个控件,马上就用. 1. 导入库 <script src="https://cdnjs. ...
- pyinstaller 3.6版本通过pip安装失败的解决办法
本机中原pyinstaller版本为3.5版本,本打算通过 pip install --upgrade pyinstaller进行升级,竟然报错,后面卸载再重新安装也一样报错,没办法看来通过pip是暂 ...
- CodeForces - 977E
题:https://codeforces.com/problemset/problem/977/E 题意:给你一个图,问你有几个没有杂边的单环(度全为2) 分析:单环点的度数一定是2,连续边,判断是否 ...
- LeetCode No.148,149,150
No.148 SortList 排序链表 题目 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序. 示例 输入: 4->2->1->3 输出: 1->2 ...
- ClipboardMonitor的下载和使用
本工具可以实时监视剪贴板的变化,可以用于32位和64位的Excel. 在任务窗格上面输入一个正则表达式,例如(\d+)\-(\d+),按下Enter确认. 然后在其他地方,例如浏览器页面或者记事本中复 ...