LabVIEW程序设计模式(五)—生产者消费者模式(4)_生产者消费者循环.docxVIP

LabVIEW程序设计模式(五)—生产者消费者模式(4)_生产者消费者循环.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
— PAGE \* Arabic 1 — LabVIEW程序设计模式(五)—生产者消费者模式(4)_生产者消费者循环 LabVIEW程序设计模式(五)—生产者/消费者模式(4)_生产者/消 费者循环 本节将使用“多循环”来解决程序并行运行的问题,那么程序中的两个循环如何进行数据交互和共享呢?最普通的方式是采用全局变量或局域变量,但是当两个循环执行的速率不相等时,必然会造成数据的丢失或重复。如前所述,LabVIEW提供了队列操作函数,允许数据的发送者和接受者之间建立一条缓冲通道,这样就避免了循环不同步带来的影响。 如图37所示,将整个过程与供水系统进行类比,在数据产生/采集端(供水局)产生数据后,并不直接向终端用户供水,因为前者产生水的速率与后者消耗水的速率并不相同。此时需要建造蓄水池将供水局产生的水放入到蓄水池中,同理获取的数据也放入该缓冲区中。当终端用户需要用水时,直接从蓄水池中获取就可以了,同理在进行数据显示和分析时直接从数据缓冲区中获取就可以了。 图37 生产者/消费者模型 当然,上面的模型也会存在一个问题:数据缓冲区/蓄水池的容量?假定供水局不停地产生自来水,而终端用户却不消耗水,这样便会导致蓄水池装满而溢出。反之当终端用户耗水量太大时,导致没有水可用。LabVIEW中的队列函数提供了一种很好的方式规避了这个问题,由于队列中的元素是“先进先出”的,因此确保了接收到的数据是有序的。在LabVIEW的队列操作中(入列和出列函数),提供了timeout选项以处理数据缓冲区的溢出或不足。当数据溢出时,入列函数(数据进入队列)将停止发送数据(处于等待状态),直到缓冲区存在数据空间或者达到了timeout设置的时间;而当数据不足时,出列函数(数据流出队列)将停止接收数据(处于等到状态),直到缓冲区进入了新的数据或者达到了timeout设置的时间。 【应用6】 本例将演示生产者/消费者循环的一些基本特性和队列操作的特点。如图38所示,生产者与消费者之间传递的数据是一个连续的sine波形,二者靠大小为20个点的缓冲区连接。右下角是“停止”按钮,用户控制程序的停止执行。例程提供了操作方式控件控制生产者和消费者的数据传递速率,包含五种状态:不生产,只消费、生成快于消费、生成速率等于消费速率、生成慢于消费、只生产,不消费。 图38 生产者/消费者例程的前面板 图39所示为生产者/消费者例程的背面板,代码由3个循环组成,依上而下分别是生产者循环(产生sine数据)、消费者循环(获取sine数据)和状态循环(获得缓存区中数据的数据量)。例程假定正常的数据发送和接收的速率是延时50ms,当需要某一段的速率减慢时需要将循环的延时设置为100ms。 例程将入列和出列函数的timeout设置为-1,表示如果没有满足条件进行入列和出列操作,循环将处于持续等待状态。在新建队列时,设置了缓冲区的大小是20个元素(图中的红色圆圈内)。最下面的循环是为了实时查看队列缓冲区中存储的元素数量。 图39 生产者/消费者例程的背面板 运行该VI,默认的操作方式是“生产速率等于消费速率”,从图40中可以看出生产者循环和消费者循环的数据是同步的,此时缓冲区内没有数据,也就是说产生的数据都被实时地消耗了。 图40 生产速率等于消费速率 如果再将操作方式设置为“生成快于消费”,可以看出数据缓冲区内将逐渐变满并保持为20个元素。此时生产者的波形将会比消费者多20个数据点(这些点保存在数据缓冲区中),如图41所示。 图41 生产速率高于消费速率 当将操作方式变为“不生产,只消费”时,生产者循环将停止生产,而消费者循环将组件消耗掉缓冲区中的数据直至数据全部消耗完(此时接收到的波形与发送的波形点一致),如图42所示。 图42 不生产,只消费 再将操作方式变为“只生产,不消费”,消费者循环将停止消费,而生产者循环将产生数据直至数据缓冲区填满,如图43所示。 图43 只生产,不消费 从运行过程来看,借助于timeout的设置,消费者接收的数据始终与生产者发送的数据是一致的,避免点数据点溢出的问题。当然,在实际使用中需要避免由于timeout设置为-1而导致的无限等待和死循环。

文档评论(0)

泰和宸风 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体泰和宸风文化科技(青岛)有限公司
IP属地北京
统一社会信用代码/组织机构代码
91370211MA94GKPQ0J

1亿VIP精品文档

相关文档