Menu:

第5章  控制程序流(9)


全局变量


全局变量基本概念

     全局变量与上面讲过的局部变量有些类似,但是它与局部变量不同的是它不禁限于单个vi中使用,全局变量允许在多个vi间无须连线即可传递信息(可以使用多种数据类型或同时访问多种类型值)。
     全局变量从LabVIEW3开始内置(这里使用内置是表示还有另外一种全局变量存在我们下面还要讲到)到LabVIEW。


全局变量的特点

1、功能十分强大
     全局变量不是一个vi(不能对它进行编程,只能用于简单的、多种类型的数据存储或数据传递),它类似于一个独立的文件。
     全局变量可以将所有的Global数据放入一个全局变量中,并可以在程序执行时分别的访问它们。这是一个很好的方式,避免了众多的全局变量名,并且管理也方便。

2、可以在整个项目中使用
     前面我们介绍过,局部变量只能在单一的vi中使用,而全局变量可以使用在多个vi中使用或者说在项目中使用。

3、必须十分小心地使用全局变量
     由于全局变量提供了一种违反严格的数据流程序设计的方式,所以存在着潜在的数据竞争机会。正是因为这个原因,有很多关于LabVIEW的书都强调“慎用全局变量”,其实这不是全局变量的过错,而是要求使用者使用、管理好全局变量。


全局变量使用中应该注意的问题

1、最先做初始化操作
     利用程序设计时的层次结构在应用程序运行之前,最先完成好全局变量的初始化工作。

2、尽量避免使用数组型全局变量
     如果在用户程序中使用数组型全局变量,多处读取时就会存在大量的数组数据复制现象,这是因为全局变量是拷贝数据副本,所以多处使用会出现大量的数据副本,这样就会导致浪费内存并且会增加程序的执行时间。对于这个问题的解决方法后面会讲到。

3、尽可能的做到对全局变量一个位置写入,多个位置读出
     避免全局变量出现竞争的最好办法是
尽可能的做到对全局变量在一个位置写入,多个位置读出。
     绝对不要在同一位置进行全局变量的读和写。


全局变量使用的简单实例


     下面是一个使用全局变量控制两个独立的While循环停止和可能产生数据竞争的例子。

     我把这两个不相关的例子放到了一起,主要是为了减少图片的数量。

1、控制Stop开关
     用一个Stop开关控制两个While循环的停止,是一个很实用的例子。在这里我要强调两点:
     1)使用这个全局变量,也可以同时控制其它的多个vi(必须是包含在同一个应用程序中的vi)停止运行。
     2)我们曾经使用过局部变量来控制两个While循环的停止(8),在那里使用的开关必须是机械开关状态图中的前三个(它们支持局部变量)。而使用全局变量则不用考虑这个问题,它对机械开关的6个状态都支持,这无疑是相当方便的。

2、竞争的可能性存在
     按数据流方式工作的观点,这两个While是同时工作的。此时对字符串全局变量进行读、写等操作可能会导致竞争发生,绝对要避免这样的情况发生,包括在其它vi中也要避免写操作发生。    


     下面是另一个使用全局变量的例子。
     在这个例子中,有两个运行速度不一样的While循环,上面的每100ms运行一次,下面那个将以尽可能快的速度运行。

     运行时首先对全局变量初始化,然后两个While在开始运行(利用人工数据关系进行控制)。上面的While循环开始不停的产生随机数,下面的循环也快速运行。
     此时如果按下Stop开关两个循环都会停止;
     此时若按下Ok按键,将会弹出个对话框(上面的循环依然运行,而下面的循环停止等待对话框的处理)点击对话框中的任意一个按键,对话框退出,下面的循环重新运行,直到Stop按键按才退出程序运行。

     这个例子说明我们可以采用这种方法控制多个While循环并行运行,每个循环可以独立的做自己的事,不会影响主循环的运行。