新闻中心

EEPW首页>测试测量>设计应用> LABVIEW的深入探索之全局变量的优劣

LABVIEW的深入探索之全局变量的优劣

作者: 时间:2017-01-09 来源:网络 收藏

------------------------------------------------------------------------------------------------------------------------

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:

------------------------------------------------------------------------------------------------------------------------------


上一页 1 2 下一页

关键词:LABVIEW全局变

评论


技术专区

关闭