解决方案
在选择使用何种方式更新前面板控件的时候,需要考虑各种性能之间的权衡。可用于更新控件的方法包括:输入控件/显示控件、局部变量以及值属性节点。以下是每种方法的优势和不足之处:
输入控件/显示控件优点
- 这种方式的逻辑是,当连续更新相同值的时候,可以防止前面板更新。这能够避免前面板刷新相应的控件。
- 不需要取消引用指针,也不需要在内存中复制数据。因此,这是速度最快,占用内存最少的方法。
缺点
- 您不能把值写入簇或者数组中单个元素的数据,而是必须更新整个变量。
C语言类比(和这段C语言代码并不完全等价,但有助于展示更新相应的前面板输入控件/显示控件时,必须执行的步骤)。
int x; // 前面板显示控件
x = 10; // 直接将值写入显示控件
局部变量优点
- 这种方式的逻辑是,当连续更新相同值的时候,可以防止前面板更新。这能够避免前面板刷新相应的控件。
- 与属性节点不同,不需要取消引用指针。因此,这种方式比属性节点更快。
缺点
- 内存密集型进程。它们和输入控件/显示控件具有相同的前面板更新的逻辑,但是它们必须为您创建的每个局部变量在内存中制作完整的数据副本。
- 您不能把值写入簇或者数组中单个元素的数据,而是必须更新整个变量。
- 如果您以不同的速率写入并且读取同一个局部变量,则可能会出现竞争状态。
C语言类比(和这段C语言代码并不完全等价,但有助于展示更新相应的前面板控件/指示器必须采取的步骤)。
int x; // 前面板显示控件
int y; // 局部变量
y=10; // 将值写入局部变量
x=y; // LabVIEW将自行执行这一步从而更新前面板的控件
属性节点优点
- 与局部变量不同,不要在内存中创建数据副本。
- 如果使用非严格类型的控件引用,则值的数据类型可以是变化的而不是控件的实际数据类型。
- 能够读取和写入簇中的单个控件。
- 可用于在子VI中更新前面板控件。
缺点
- 每次调用它们时都需要刷新前面板的控件。
- 属性节点是通过引用函数传递数据,而不是通过值函数。这意味着它们实际上是指向特定内存位置的指针。必须取消引用指针,然后再更新内存中的值。取消引用变量的过程会导致它们比输入控件/显示控件或局部变量的方式更慢。
- 属性节点导致子VI的前面板保留在内存中,这会增加内存的使用。如果不显示子VI的前面板,请移除属性节点以减少内存使用。
C语言类比(和这段C语言代码并不完全等价,但有助于展示更新相应的前面板控件/指示器必须采取的步骤)。
int x; // 前面板显示控件
int *x_pointer = &x; // 给前面板显示控件创建指针(属性节点)
*x_pointer = 1; // * 用于区分指针和更新的变量x,这是每次执行属性节点的时候都要运行的一个步骤