在 SubVI 中一步获取控件引用句柄的值
Get value of control refnum in one step in SubVI
我正在尝试通过控件引用句柄创建仅处理相关控件的子 VI,从而简化大型 UI。
现在,当从主 VI 中提取代码并重新连接到子 VI 时,事情变得一团糟。
对于read/write这些refnums,我必须做一个两步过程。首先添加一个终端来获取控件的引用句柄值,然后再添加一个终端来获取控件的值。
在任何地方连接引用句柄并不是一个真正的选择,因为如果引用句柄超过两个,那会产生更多的意大利面条。 (通常是 4-10 个)
有没有更好的方法?
更新
伙计们,这是关于上图的低级问题,并不是真正关于大规模架构/设计模式的问题。我正在使用 QMH,类,et.al。在适当情况下。
我只是觉得应该有一种方法可以一步从类型化控件引用中获取类型化值。感觉有点一般。
一般来说,从性能的角度来看,read/write value 使用 refnum 不是最佳做法。每次都需要将线程交换到 UI 线程(这是一个繁重的过程),而 FP 终端有特权能够在不切换执行线程且没有互斥摩擦的情况下更新面板。
Using references to access value
Requires to update the front panel item every single time they are called.
They are a pass by reference function as opposed to a pass by value function. This means they are essentially pointers to specific memory locations. The pointers must be de-referenced, and then the value in memory updated. The process of de-referencing the variables causes them to be slower than Controls/Indicators, or Local Variables.
Property Nodes cause the front panel of a SubVI to remain in memory, which increases memory use. If the front panel of a SubVI is not displayed, remove property nodes to decrease memory use.
如果在此之后您想使用此方法,您可以使用 VI 脚本来加速该过程:http://sine.ni.com/nips/cds/view/p/lang/en/nid/209110
我不确定是否有一种低接触的方式来去除带有大量控件和指示器的 UI 意大利面条。
我的建议是将顶层 VI 改造成 queued message handler,这样您就可以将用户交互与应用程序的响应分离开来。换句话说,与其移动 both 控件和处理它们对子 VI 的更改的代码(如您当前所做的那样),不如将控件保持在原处(因此您不必不需要使用 ref nums 和 属性 节点),只需将代码移动到子 VI。
此设计模式内置于最新版本的 LabVIEW 中:导航至 文件 » 创建项目 使 LabVIEW 生成您可以评估的项目。有关了解如何扩展和自定义它的更多信息,请参阅此 NI 幻灯片:Decisions Behind the Design of the
排队消息处理程序模板.
在 controls/indicators 实际存在的调用方 VI 中,创建所有引用,然后将它们捆绑到相关部分的集群中。将簇传递到您的子 VI 中,只为给定的子 VI 提供它需要的簇。这既可以使您的控制台保持整洁,也可以使每个子 VI 正在与之通信的接口一目了然。您可能想要创建一个 LV class 来进一步封装和定义子 UI 操作,而不是集群,但这通常只适用于 UI 的某些组件将在其他 UI 中重复使用。
我正在尝试通过控件引用句柄创建仅处理相关控件的子 VI,从而简化大型 UI。
现在,当从主 VI 中提取代码并重新连接到子 VI 时,事情变得一团糟。
对于read/write这些refnums,我必须做一个两步过程。首先添加一个终端来获取控件的引用句柄值,然后再添加一个终端来获取控件的值。
在任何地方连接引用句柄并不是一个真正的选择,因为如果引用句柄超过两个,那会产生更多的意大利面条。 (通常是 4-10 个)
有没有更好的方法?
更新
伙计们,这是关于上图的低级问题,并不是真正关于大规模架构/设计模式的问题。我正在使用 QMH,类,et.al。在适当情况下。
我只是觉得应该有一种方法可以一步从类型化控件引用中获取类型化值。感觉有点一般。
一般来说,从性能的角度来看,read/write value 使用 refnum 不是最佳做法。每次都需要将线程交换到 UI 线程(这是一个繁重的过程),而 FP 终端有特权能够在不切换执行线程且没有互斥摩擦的情况下更新面板。
Using references to access value Requires to update the front panel item every single time they are called.
They are a pass by reference function as opposed to a pass by value function. This means they are essentially pointers to specific memory locations. The pointers must be de-referenced, and then the value in memory updated. The process of de-referencing the variables causes them to be slower than Controls/Indicators, or Local Variables. Property Nodes cause the front panel of a SubVI to remain in memory, which increases memory use. If the front panel of a SubVI is not displayed, remove property nodes to decrease memory use.
如果在此之后您想使用此方法,您可以使用 VI 脚本来加速该过程:http://sine.ni.com/nips/cds/view/p/lang/en/nid/209110
我不确定是否有一种低接触的方式来去除带有大量控件和指示器的 UI 意大利面条。
我的建议是将顶层 VI 改造成 queued message handler,这样您就可以将用户交互与应用程序的响应分离开来。换句话说,与其移动 both 控件和处理它们对子 VI 的更改的代码(如您当前所做的那样),不如将控件保持在原处(因此您不必不需要使用 ref nums 和 属性 节点),只需将代码移动到子 VI。
此设计模式内置于最新版本的 LabVIEW 中:导航至 文件 » 创建项目 使 LabVIEW 生成您可以评估的项目。有关了解如何扩展和自定义它的更多信息,请参阅此 NI 幻灯片:Decisions Behind the Design of the 排队消息处理程序模板.
在 controls/indicators 实际存在的调用方 VI 中,创建所有引用,然后将它们捆绑到相关部分的集群中。将簇传递到您的子 VI 中,只为给定的子 VI 提供它需要的簇。这既可以使您的控制台保持整洁,也可以使每个子 VI 正在与之通信的接口一目了然。您可能想要创建一个 LV class 来进一步封装和定义子 UI 操作,而不是集群,但这通常只适用于 UI 的某些组件将在其他 UI 中重复使用。