比较纠结的应用
1、原理上
即使是某个循环停止,那也是数据流线走到了该听的地方了。即,除了莫名其妙,数据流线会一直向下走的。
2、实现方案
(1)在While循环的每一步中都判断是否停止,显然这不满足你的要求。
(2)想要在某个While循环中途通过按钮点击停止循环,只能用一个新的控制线程控制这个循环线程。但是,在同一个VI中,直到LV09也没有看到VI内线程控制的相关控件。所以,只能将你想要中途中断的循环线程放入另一个VI中,如果想要中途停止,那么只要使用VI方法节点Abort VI即可实现。数据怎么办?简单,合理的使用一些线程间通讯的手段即可,比如使用队列Queue。
具体操作如下:将工作线程(即你想要中断停止的循环)封装入一个子VI;该VI除了程序运行所需的输入参数外,再增加一个Queue引用的输入参数,无需输出参数(或者Error Out),因为,这个VI被执行时,有用的数据是怎么也不会从输出端输出的。在VI内部将有用的数据打入队列就可以了,这时,在主VI中,就可以使用引用把数据读出来了。于是:循环可控,数据仍然读出。
我感谢两位的耐心解答,我知道8.6版本的支持这种,但卸载安装很麻烦,假如卸不干净的话会出现很多问题。那可不可实现这样的功能——加一个定时器,如果在定时器内没有收到消息就退出循环,如果收到了消息就重启定时器,重新开始等待消息?
如果实在不行,采用每一步都判断的方法代价会不会很大?
没有用过8.2,所以还不太清楚差别。LabVIEW每个版本都有一些不向下兼容的改动,比如LV09里添加了递归调用、数据引用等等。呵呵
循环本身便是每步都判断的。单个循环关键是不可控的,除非执行完毕。如果你的循环体里有一个延时模块,那么无论怎样也要在延时结束后,才能判断诸如消息等是否结束。又或者说,循环体内包含工作数据流和控制数据流,那么个人认为是这两个数据流同时结束时,本次循环才结束。也就是说,如果工作数据流很长,控制数据流很短,控制数据流先算出结果,那么此时循环也不会因为停止端有了结果而结束本次循环,而是等待那条很长的工作数据流结束。但我们想要的效果却是,无论循环线程如何,当我需要的时候,其就必须马上停止。所以可行的解决方案一定是AbortProcess。要么在同一VI里Abort工作线程,要么将工作线程封装,Abort其所在的VI。目前LabVIEW支持后者,前者尚不支持,但8.2连前者都不支持,本人认为是没有任何希望了,呵呵。
另外,一个也是从论坛里找到的工具,专门用于卸载LV,它会罗列所有NI组件,然后卸载。另一个比较好的是,你并不需要卸载8.2而按照其他版本,它们可以共存的,我的系统里就同时有8.5、8.6以及2009。版本控制好便可以了。
呈上:
另外一种假实现:使用用户注册事件,将一个很长的工作数据流分割成一段一段的短片;步骤之间使用激发用户事件。当然,整体的线程为一个事件循环。本事件循环中,不单单有工作数据事件,还有控制数据流事件。我们可以添加类似“Abort”的用户控制事件。由于工作事件流是分片的,循序中间夹一些控制事件流,此时,就可以在工作的期间,在需要的时候结束循环、或者暂停循环、重启循环。