根据所使用的LabVIEW版本,从以下方法中进行选择,用以使用一个停止按钮停止LabVIEW中的多个并行While循环。
注意:
下面列出的方法并不是停止并行While循环的方法的详尽介绍。这些方法是最常见的方法。
如使用LabVIEW 2016,可使用通道线通过一个停止按钮停止多个并行的While循环。这是可能的,因为通道线是异步线,它们在不强制执行顺序的情况下连接两个并行的While循环。因此,两个并行的While循环之间没有数据相关性。
注意:
LabVIEW Real-Time模块支持通道线,但LabVIEW FPGA模块不支持。
以下框图演示了使用
Tag
通道停止并行While循环:
以下列表描述了有关上图程序框图的重要细节:
-
循环A
包含一个
Tag写入
端点,该端点将值写入
Tag
通道。
-
通道线将
Tag
写入端点的通道输出连接到
Tag
读取端点。
-
循环B
包含一个
Tag
读取端点,该端点从
Tag
通道读取值。
-
连接到
循环A中
写入端点的
元素
参数的
停止
按钮与
循环B
通信。如果单击
循环A中
的停止按钮,
循环B
也将停止。
以下框图演示了使用
串流
通道停止并行While循环:
当使用
串流
通道,连接到在
循环A
中的作家端点的
最后一个元素
参数
停止
按钮与
循环B
通信。
当用于停止并行While循环时,
Tag
通道和
串流
通道具有主要区别。
-
使用
Tag
通道停止并行While循环会导致所有循环尽快停止,因为
循环A
中的
停止
按钮值直接与
循环B
通信。使用
串流
通道停止并行While循环可能导致
循环B
比
循环A
早停止若干次迭代
,
因为从
循环A
中的
停止
按钮值与通过
循环B
的
最后一个元素?
参数进行通信,这意味着
循环A
在写入最后一个元素后立即停止。但是,
循环B
继续读取通道中的其余元素,直到读取完最后一个元素,它才会停止。所谓
串流
通道确保通过该通道传送的所有数据元素
循环B
停止之前得到处理。
-
Tag
通道允许您停止两个或更多并行的While循环,因为
Tag
通道可以分叉到多个编写器和读取器中。
串流
通道仅允许您停止两个并行的While循环,因为
串流
通道仅允许一个写入器和一个读取器。
下面的框图演示了如何使用
Tag
通道停止三个并行的While循环。
您不能将以前的
Tag
架构扩展为具有多个停止按钮。但是,您可以使用
labview\vi.lib\ChannelSupport
的“
Share Stop Signal”
VI添加一个或多个停止按钮,使用任意一个停止按钮可以停止多个并行的While循环。
以下VI片段演示了使用两个停止按钮之一来停止多个并行的While循环。要添加更多停止按钮,请遵循相同的体系结构。
您可以使用一个停止按钮停止多个并行的While循环,方法是使用每个其他循环的局部变量,将第一个循环控件中的布尔停止按钮值传递给所有其他循环。下面的程序框图演示了使用局部变量停止两个并行的While循环。
以下列表描述了有关上图程序框图的重要细节
-
顶部循环包含一个
停止
控件。通过右键单击前面板上的
停止
控件并选择“
机械动作»单击时转换”
,配置
停止
控件的
机械动作。
这允许所有循环读取
停止
布尔值,当按下该值时,锁存器将在读取值时重置为真,从而使某些循环仍在运行。
-
底部的两个循环包含
停止
控件的局部变量。通过右键单击
停止
控件并选择
创建»局部变量
来创建局部变量。通过右键单击局部变量并选择“
转换为读取”,
将局部变量配置为读取值
-
重要的是要注意“
Reinit To Default”
调用节点是隐式地引用了停止按钮
,
这将在下一次运行开始时将值重置为真。
-
所有这些循环都包含一个
等待(ms),
以突出显示所有循环都将停止,而不论它们的运行时间如何。
要停止三个以上的并行While循环,请遵循相同的体系结构,添加更多局部变量以从初始
停止
控件中读取。
您可以使用属性节点将布尔型
停止
按钮值从第一个循环的控件传递到所有其他循环。下面的框图演示了使用属性节点停止两个并行的While循环。
以下列表描述了有关先前框图的重要细节:
-
顶部循环包含一个
停止
控件。通过右键单击前面板上的
停止
控件并选择“
机械动作»单击时转换”
,配置
停止
控件的
机械动作。
这允许所有循环读取
停止
布尔值,当按下该值时,锁存器将在读取值时重置为真,从而使某些循环仍在运行。
-
底部循环包含
停止
控件的属性节点。通过右键单击
停止
控件并选择
创建»属性节点»值
来创建属性节点。通过右键单击值属性节点并选择“
转换为读取”,
将值属性节点配置为读取值。
-
重要的是要注意“
Reinit To Default”
调用节点是隐式地引用了停止按钮
,
这将在下一次运行开始时将值重置为真。
-
所有这些循环都包含一个
等待(ms),
以突出显示所有循环都将停止,而不论它们的运行时间如何。
要停止两个以上的并行While循环,请遵循相同的体系结构,方法是添加更多值属性节点以从初始
停止
控控件中读取。
有关何时使用局部变量和属性节点的更多信息,请参阅
局部变量与值属性节点之间的区别
。
对于涉及复杂行为的应用程序,可以使用通知器来停止并行运行的多个循环。可从“
编程”»“同步”»“通知器操作”
面板访问通知器功能。
注意:
通知器的使用可以轻松扩展到多个线程,但并不总是与现有程序体系结构很好地集成。
以下VI代码段演示了一种通知器可用于停止多个While循环的方式。
以下列表描述了有关先前框图的重要细节:
-
顶部循环的每次迭代都会将
停止
按钮的状态写入通知器。
-
其他两个循环在每次迭代时检查通知器的状态。
-
注意:
确保在停止监视通知器的所有线程之前,不释放该通知程序。在上图的VI片段中,
合并错误
VI保证
释放通知器
VI将在所有循环停止之前不执行。
-
单击
停止
按钮时,状态将发送到通知器,这将导致所有循环停止。
-
队列
对于涉及更复杂行为的应用程序,您可以使用队列来停止并行运行的多个循环。可从“
编程”»“同步”»“队列操作”选项
板访问队列功能。
注意:
许多较大的应用程序已经有一个队列系统,可以在并行循环之间交换数据。在这些设置中,可以修改或增强现有队列,以此包括用于并行循环的停止指令。
以下VI片段演示了如何使用队列来停止多个While循环:
一些使用主从结构的应用程序在从线程退出之前释放队列。从被破坏的引用调用出队列引发的错误后用于停止从循环。代替依赖错误条件来停止从属循环,上图的VI片段具有离散的停止指令,该指令从主循环传递至从循环。
相关链接