LABVIEW的深入探索之全局變量的優(yōu)劣
------------------------------------------------------------------------------------------------------------------------
KEVIN:
我在程序開發(fā)時,習(xí)慣于在多個消費(fèi)者情況下使用“通告”。通常情況下,只有一個生產(chǎn)者。但是像全局變量情況,可能會有幾個“潛在”的生產(chǎn)者。
對于使用通告,消費(fèi)者可以進(jìn)行選擇。通告可以不管消費(fèi)這是否已經(jīng)消費(fèi)了先前的數(shù)據(jù),隨時查詢最新的數(shù)據(jù),這類似于全局變量。通告也可以一直等待,直至有最新更新的數(shù)據(jù),避免不斷的輪詢數(shù)據(jù),加重CPU的負(fù)擔(dān),這個是全局變量無法實(shí)現(xiàn)的。
----------------------------------------------------------------------------------------------------------------------------
BEN:
很抱歉沒能早點(diǎn)參與這個話題的討論。我并非求全責(zé)備,但是全局變量存在下列主要問題:
1、數(shù)據(jù)拷貝
2、利用線程
3、對于一個寫入者,多個讀取者,OK.但是這要求開發(fā)者必須確認(rèn)只有唯一一個寫入者。這對一個擁有800多個VI,有些是動態(tài)載入的情況下,是很難做到的。
4、靈活性 。如果你使用一個LV2型全局變量,需要的情況下,你可以很安全地添加新的新的寫入者。在編寫大型應(yīng)用時,這的確是令人頭疼的問題。
5、性能。LV2全局變量可以很容易重用緩存,全局變量不行。
-----------------------------------------------------------------------------------------------------------------
RAY:
我同意大家的看法。我通常用全局變量保持靜態(tài)數(shù)據(jù),比如IP地址。
-------------------------------------------------------------------------------------------------------------------------
TST:
VI之間傳遞數(shù)據(jù)有幾種方法。
首先,可以通過函數(shù)連接器的端子連線數(shù)據(jù),這是LABVIEW傳遞數(shù)據(jù)最有效的方法,同時也最安全,最容易理解。但是對于一個正在運(yùn)行的VI,想傳入數(shù)據(jù),這種連線方法無能為力。
第二,有一種LV內(nèi)置的全局變量(上面討論的),這是VI之間傳遞數(shù)據(jù)最快捷的方法。同時非常易于管理,你很容易可以找到引用它們的位置。主要不利之處在于,多處創(chuàng)建全局變量時,都會生成全局變量的數(shù)據(jù)拷貝。這會引發(fā)數(shù)據(jù)競爭。
第三,通過LV2全局變量,LV2的命名是根據(jù)變量出現(xiàn)的LABVIEW版本號,也有稱作功能全局變量、函數(shù)全局變量或者USR全局變量。LV2全局變量是由一個僅循環(huán)一次的VI構(gòu)成的,循環(huán)結(jié)構(gòu)中包含未初始化的移位寄存器(USR)--USR用于在多次運(yùn)行VI之間保持值。如果該VI設(shè)置成不重入方式,那么在不同位置多次調(diào)用這個VI時,USR可以共享數(shù)據(jù)。
LV2全局變量的優(yōu)點(diǎn)是只存在一個數(shù)據(jù)拷貝,而且是內(nèi)在的鎖定機(jī)制。另外的優(yōu)勢在于可以通過添加代碼提高它的性能,因?yàn)榭梢杂糜趽碛凶约旱拇鎯χ?,這是非常有用的。
第四,利用隊(duì)列(高級函數(shù)選板,同其它同步函數(shù)在一起)。隊(duì)列的常規(guī)用法是在隊(duì)列中保存產(chǎn)生的數(shù)據(jù),但是隊(duì)列也有一種特殊的方法,使用隊(duì)列作為全局變量。這種方式隊(duì)列中只保存一個元素,每次調(diào)用隊(duì)列開始時要取出元素,此時其它要使用隊(duì)列的地方必須等待,直至正在調(diào)用隊(duì)列的VI完成,把元素加入隊(duì)列。利用隊(duì)列構(gòu)建的全局變量速度高于LV2全局變量,但是比內(nèi)置的全局變量慢。
使用全局變量時,有幾點(diǎn)必須指出,供參考。
1、打斷了數(shù)據(jù)流。這是非常重要的一點(diǎn),因?yàn)榇驍嗔藬?shù)據(jù)流會導(dǎo)致程序難于理解,難于調(diào)試和排錯。
2、競爭。當(dāng)有多個位置寫入全局變量時,非常容易導(dǎo)致數(shù)據(jù)丟失。
------------------------------------------------------------------------------------------------------------------
BEN:
使用全局變量對于大型應(yīng)用程序的開發(fā)和升級非常危險(xiǎn)。我再次強(qiáng)調(diào)全局變量是魔鬼,是魔鬼。
---------------------------------------------------------------------------------------------------------------------------
TBOB:
我再次重復(fù)幾周前說過的話,全局變量不是魔鬼,不恰當(dāng)?shù)厥褂萌肿兞坎攀悄Ч怼?p>我已經(jīng)在測試測量領(lǐng)域開發(fā)了一些大型應(yīng)用程序,我利用全局變量保存所有儀器的GPIB地址和PCI卡的名稱,這些東西絕對不會在運(yùn)行中寫入,總是在讀取。我就不明白了,這種情況下我用全局變量有錯嗎?
某些情況下,全局變量對簡化程序是必須的。我使用全局變量類似于C語言的常量定義。
-----------------------------------------------------------------------------------------------------------------------
RAY:
我偶爾會使用全局變量,使用場合與TBOB類似。
----------------------------------------------------------------------------------------------------------------------
TBOB:
我曾經(jīng)使用INI文件或者配置文件保存配置數(shù)據(jù),但是每次讀取它們非常繁瑣,而且每當(dāng)我需要讀取一個儀器的GPIB地址時,速度很慢。如果使用文件,我通常在程序開始時讀取文件,然后把配置數(shù)據(jù)保存在WORM全局變量(寫一次,讀任意)中,在狀態(tài)機(jī)中使用它們。
--------------------------------------------------------------------------------------------------------------------------
BEN:
周末我又考慮一下全局變量的問題。
WORM GLOBALS(寫一次,讀多次)----------在你是程序開發(fā)者而且只有你是程序開發(fā)者的情況下是安全的。
------------------------------------------------------------------------------------------------------------------------------
TBOB:
很現(xiàn)實(shí)的想法,BEN.我只有在常量的情況或者WORM GLOBALS時才使用全局變量。技巧就是對于我的繼任者,也告誡他們和采用同樣的做法。
------------------------------------------------------------------------------------------------------------------------------
TBOB:
------------------------------------------------------------------------------------------------------------------------------
評論