LabVIEW程序设计模式(五)—生产者/消费者模式(2)_VI的可重入性
扫描二维码
随时随地手机看文章
在介绍VI的动态调用之前有必要对LabVIEW在执行VI过程中的规则有个大致的了解。众所周知,LabVIEW是通过VI的文件名(VI Name)来表示独立的VI的,并不是VI的路径。因此,LabVIEW不允许具有相同名字的VI同时载入内存中,即使这些VI存储在不同的路径中。
在前面曾经提到,LabVIEW本身就是一种多线程设计的语言。那么当同一背面板中放置两个VI的实例时代码应该如何执行呢?在图 29中,右侧是测试VI运行的时间,左侧是Wait.vi的具体实现代码,仅仅是等待一定的秒数。那么在右侧的VI中,输出的Time是多少呢?是3秒还是2秒?
图 29 Reentrant Execution
打开VI的Highlight调试工具,可以看出两个Wait.vi实例的调用并不是同时执行的,而是依次按顺序执行的,至于哪一个实例先执行是不确定的。这是由于LabVIEW本身是并行设计的,从理论上而言,两个VI的实例是同步执行的,但是如果两个Wait.vi实例同时执行必定会产生参数赋值紊乱,因为LabVIEW只允许内存中存在一个名称的VI。因此,此时Time的输出结果是3秒。
如果在实际使用中需要这样的应用该如何解决呢?LabVIEW提供了VI的可重入技术,打开Wait.vi,单击
图 30 VI Properties
事实上,LabVIEW的可重入技术相当于在原有VI的基础上产生了一个相同的副本,打开Wait.vi从标题栏可以看出VI的名称为Wait.vi:1(clone)。同理这是由于LabVIEW中不允许内存中的VI存在同名,VI的可重入技术相当于产生了与原VI具有同样功能的新VI并且修改了该VI的命名。
在实际应用中,需要根据情况决定是否设置VI的可重入属性,灵活使用。并不是需要将所有的VI都设置为可重入,那将占据大量的内存资源。