我正在尝试通过控制引用来创建仅处理相关控件的SubVI来解决大意大利面。
现在,当从主VI中提取代码并重新连接到子VI时,事情变得杂乱无章。
要读取/写入这些引用句柄,我必须执行两个步骤。首先添加一个终端以获取控制引用句柄值,然后添加另一个终端以获取控件的值。
在任何地方连接refnums并不是一个真正的选择,因为如果有两个以上的意大利面条会产生更多意大利面。 (通常是4-10)
有更好的方法吗?
更新
伙计们,这是关于上图的一个低级问题,而不是关于大规模架构/设计模式的问题。我正在使用QMH,类,et.al.在适当情况下。
我只是觉得应该有一种方法可以从一个类型化的控件引用中获取类型值。这种感觉很常见。
答案 0 :(得分:3)
在调用者VI中,控件/指示器实际存在,创建所有引用,然后将它们捆绑到相关部分的集群中。将群集传递到子VI中,为给定的子VI提供所需的群集。这既保持了你的conpane清理,也清楚了每个子VI正在与之交谈的界面。您可能希望创建一个LV类来进一步封装和定义子UI操作,而不是集群,但这通常只适用于较大的项目,其中UI的某些组件将在其他UI中重用。
答案 1 :(得分:2)
我不确定是否有一种低触摸方式来消除具有大量控件和指示器的用户界面。
我的建议是将顶级VI重写为queued message handler,这样您就可以将用户交互与应用程序的响应分离。换句话说,不是移动两者控件和处理他们对子VI的更改的代码(正如您当前所做的那样),这将使控件保持原样(因此您不需要)使用引用和属性节点)并仅将代码移动到子VI。
此设计模式内置于最新版本的LabVIEW中:导航至文件»创建项目,以使LabVIEW生成您可以评估的项目。有关了解如何扩展和自定义它的更多信息,请参阅此NI幻灯片:Decisions Behind the Design of the Queued Message Handler Template。
答案 2 :(得分:1)
通常,从性能的角度来看,使用refnum读取/写入值不是最佳实践。它每次都需要一个线程交换到UI线程(这是一个繁重的过程),而FP终端有权在不切换执行线程和没有互斥摩擦的情况下更新面板。
使用对访问值的引用 需要在每次呼叫时更新前面板项目 它们是通过引用函数传递而不是传递值函数。这意味着它们实际上是指向特定内存位置的指针。必须取消引用指针,然后更新内存中的值。取消引用变量的过程会导致它们比控件/指示器或局部变量慢。 属性节点导致SubVI的前面板保留在内存中,这会增加内存使用。如果未显示SubVI的前面板,请删除属性节点以减少内存使用。
如果在此之后您想使用此方法,则可以使用VI脚本来加速该过程:http://sine.ni.com/nips/cds/view/p/lang/en/nid/209110