新聞中心

        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全局變

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 佳木斯市| 平乡县| 晋州市| 涟水县| 蒲城县| 扶风县| 绥德县| 宜丰县| 深泽县| 文昌市| 南投市| 阳城县| 岑巩县| 武邑县| 正安县| 治多县| 富裕县| 新河县| 丹东市| 虎林市| 蓬莱市| 建阳市| 上杭县| 太谷县| 津南区| 萨嘎县| 视频| 贞丰县| 华阴市| 蓬安县| 平阳县| 二连浩特市| 通化市| 塘沽区| 乐昌市| 天水市| 方城县| 航空| 金华市| 博湖县| 铁岭市|