LABVIEW的深入探索之全局变量的优劣
------------------------------------------------------------------------------------------------------------------------
KEVIN:
我在程序开发时,习惯于在多个消费者情况下使用“通告”。通常情况下,只有一个生产者。但是像全局变量情况,可能会有几个“潜在”的生产者。
对于使用通告,消费者可以进行选择。通告可以不管消费这是否已经消费了先前的数据,随时查询最新的数据,这类似于全局变量。通告也可以一直等待,直至有最新更新的数据,避免不断的轮询数据,加重CPU的负担,这个是全局变量无法实现的。
----------------------------------------------------------------------------------------------------------------------------
BEN:
很抱歉没能早点参与这个话题的讨论。我并非求全责备,但是全局变量存在下列主要问题:
1、数据拷贝
2、利用线程
3、对于一个写入者,多个读取者,OK.但是这要求开发者必须确认只有唯一一个写入者。这对一个拥有800多个VI,有些是动态载入的情况下,是很难做到的。
4、灵活性 。如果你使用一个LV2型全局变量,需要的情况下,你可以很安全地添加新的新的写入者。在编写大型应用时,这的确是令人头疼的问题。
5、性能。LV2全局变量可以很容易重用缓存,全局变量不行。
-----------------------------------------------------------------------------------------------------------------
RAY:
我同意大家的看法。我通常用全局变量保持静态数据,比如IP地址。
-------------------------------------------------------------------------------------------------------------------------
TST:
VI之间传递数据有几种方法。
首先,可以通过函数连接器的端子连线数据,这是LABVIEW传递数据最有效的方法,同时也最安全,最容易理解。但是对于一个正在运行的VI,想传入数据,这种连线方法无能为力。
第二,有一种LV内置的全局变量(上面讨论的),这是VI之间传递数据最快捷的方法。同时非常易于管理,你很容易可以找到引用它们的位置。主要不利之处在于,多处创建全局变量时,都会生成全局变量的数据拷贝。这会引发数据竞争。
第三,通过LV2全局变量,LV2的命名是根据变量出现的LABVIEW版本号,也有称作功能全局变量、函数全局变量或者USR全局变量。LV2全局变量是由一个仅循环一次的VI构成的,循环结构中包含未初始化的移位寄存器(USR)--USR用于在多次运行VI之间保持值。如果该VI设置成不重入方式,那么在不同位置多次调用这个VI时,USR可以共享数据。
LV2全局变量的优点是只存在一个数据拷贝,而且是内在的锁定机制。另外的优势在于可以通过添加代码提高它的性能,因为可以用于拥有自己的存储值,这是非常有用的。
第四,利用队列(高级函数选板,同其它同步函数在一起)。队列的常规用法是在队列中保存产生的数据,但是队列也有一种特殊的方法,使用队列作为全局变量。这种方式队列中只保存一个元素,每次调用队列开始时要取出元素,此时其它要使用队列的地方必须等待,直至正在调用队列的VI完成,把元素加入队列。利用队列构建的全局变量速度高于LV2全局变量,但是比内置的全局变量慢。
使用全局变量时,有几点必须指出,供参考。
1、打断了数据流。这是非常重要的一点,因为打断了数据流会导致程序难于理解,难于调试和排错。
2、竞争。当有多个位置写入全局变量时,非常容易导致数据丢失。
------------------------------------------------------------------------------------------------------------------
BEN:
使用全局变量对于大型应用程序的开发和升级非常危险。我再次强调全局变量是魔鬼,是魔鬼。
---------------------------------------------------------------------------------------------------------------------------
TBOB:
我再次重复几周前说过的话,全局变量不是魔鬼,不恰当地使用全局变量才是魔鬼。
我已经在测试测量领域开发了一些大型应用程序,我利用全局变量保存所有仪器的GPIB地址和PCI卡的名称,这些东西绝对不会在运行中写入,总是在读取。我就不明白了,这种情况下我用全局变量有错吗?
某些情况下,全局变量对简化程序是必须的。我使用全局变量类似于C语言的常量定义。
-----------------------------------------------------------------------------------------------------------------------
RAY:
我偶尔会使用全局变量,使用场合与TBOB类似。
----------------------------------------------------------------------------------------------------------------------
TBOB:
我曾经使用INI文件或者配置文件保存配置数据,但是每次读取它们非常繁琐,而且每当我需要读取一个仪器的GPIB地址时,速度很慢。如果使用文件,我通常在程序开始时读取文件,然后把配置数据保存在WORM全局变量(写一次,读任意)中,在状态机中使用它们。
--------------------------------------------------------------------------------------------------------------------------
BEN:
周末我又考虑一下全局变量的问题。
WORM GLOBALS(写一次,读多次)----------在你是程序开发者而且只有你是程序开发者的情况下是安全的。
------------------------------------------------------------------------------------------------------------------------------
TBOB:
很现实的想法,BEN.我只有在常量的情况或者WORM GLOBALS时才使用全局变量。技巧就是对于我的继任者,也告诫他们和采用同样的做法。
------------------------------------------------------------------------------------------------------------------------------
TBOB:
------------------------------------------------------------------------------------------------------------------------------
评论