NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

while、For循环中途暂停或退出的问题

已解决!
转到解答
我现在想实现在循环中途按下按钮,退出循环,但取消按钮不管用,改用Event结构也没有用。能否帮忙指点一下问题出在哪里?我用的是Labview8.2。
0 项奖励
1 条消息(共 8 条)
7,890 次查看

比较纠结的应用

1、原理上

即使是某个循环停止,那也是数据流线走到了该听的地方了。即,除了莫名其妙,数据流线会一直向下走的。

 

2、实现方案

(1)在While循环的每一步中都判断是否停止,显然这不满足你的要求。

(2)想要在某个While循环中途通过按钮点击停止循环,只能用一个新的控制线程控制这个循环线程。但是,在同一个VI中,直到LV09也没有看到VI内线程控制的相关控件。所以,只能将你想要中途中断的循环线程放入另一个VI中,如果想要中途停止,那么只要使用VI方法节点Abort VI即可实现。数据怎么办?简单,合理的使用一些线程间通讯的手段即可,比如使用队列Queue。

具体操作如下:将工作线程(即你想要中断停止的循环)封装入一个子VI;该VI除了程序运行所需的输入参数外,再增加一个Queue引用的输入参数,无需输出参数(或者Error Out),因为,这个VI被执行时,有用的数据是怎么也不会从输出端输出的。在VI内部将有用的数据打入队列就可以了,这时,在主VI中,就可以使用引用把数据读出来了。于是:循环可控,数据仍然读出。

2 条消息(共 8 条)
7,884 次查看
解答
已被主题作者 LiCat 接受
例子,只能到8.6版本了,再低就要报错。麻烦你得找一个8.6的软件。
下载全部
3 条消息(共 8 条)
7,877 次查看

我感谢两位的耐心解答,我知道8.6版本的支持这种,但卸载安装很麻烦,假如卸不干净的话会出现很多问题。那可不可实现这样的功能——加一个定时器,如果在定时器内没有收到消息就退出循环,如果收到了消息就重启定时器,重新开始等待消息?

如果实在不行,采用每一步都判断的方法代价会不会很大?

帖子被LiCat在 11-30-2009 12:08 AM
时编辑过了
0 项奖励
4 条消息(共 8 条)
7,873 次查看
假如在每一步都添加判断,代价大不大?
0 项奖励
5 条消息(共 8 条)
7,872 次查看

没有用过8.2,所以还不太清楚差别。LabVIEW每个版本都有一些不向下兼容的改动,比如LV09里添加了递归调用、数据引用等等。呵呵

 

循环本身便是每步都判断的。单个循环关键是不可控的,除非执行完毕。如果你的循环体里有一个延时模块,那么无论怎样也要在延时结束后,才能判断诸如消息等是否结束。又或者说,循环体内包含工作数据流和控制数据流,那么个人认为是这两个数据流同时结束时,本次循环才结束。也就是说,如果工作数据流很长,控制数据流很短,控制数据流先算出结果,那么此时循环也不会因为停止端有了结果而结束本次循环,而是等待那条很长的工作数据流结束。但我们想要的效果却是,无论循环线程如何,当我需要的时候,其就必须马上停止。所以可行的解决方案一定是AbortProcess。要么在同一VI里Abort工作线程,要么将工作线程封装,Abort其所在的VI。目前LabVIEW支持后者,前者尚不支持,但8.2连前者都不支持,本人认为是没有任何希望了,呵呵。

 

另外,一个也是从论坛里找到的工具,专门用于卸载LV,它会罗列所有NI组件,然后卸载。另一个比较好的是,你并不需要卸载8.2而按照其他版本,它们可以共存的,我的系统里就同时有8.5、8.6以及2009。版本控制好便可以了。

 

 

 

6 条消息(共 8 条)
7,865 次查看

呈上:

 

另外一种假实现:使用用户注册事件,将一个很长的工作数据流分割成一段一段的短片;步骤之间使用激发用户事件。当然,整体的线程为一个事件循环。本事件循环中,不单单有工作数据事件,还有控制数据流事件。我们可以添加类似“Abort”的用户控制事件。由于工作事件流是分片的,循序中间夹一些控制事件流,此时,就可以在工作的期间,在需要的时候结束循环、或者暂停循环、重启循环。

7 条消息(共 8 条)
7,862 次查看
非常感谢你的帮助,我都尽力去试一试,尤其是你说的几个版本可以共存,这个信息简直太好了!
0 项奖励
8 条消息(共 8 条)
7,844 次查看