<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 測試測量 > 設計應用 > LABVIEW的深入探索之全局變量的優(yōu)劣

          LABVIEW的深入探索之全局變量的優(yōu)劣

          作者: 時間:2017-01-09 來源:網(wǎng)絡 收藏
          最近GSD論壇上的一個帖子談到了全局變量的問題:

          sandan0615:

          本文引用地址:http://www.ex-cimer.com/article/201701/337245.htm

          在保證數(shù)據(jù)不沖突的情況下可以對全局變量寫操作嗎?
          RTRT,各位高手解釋下,我在陳樹學老師的寶典里看到說在程序里要避免對全局變量進行寫操作。

          czhen:

          當然可以
          不行的話,要它干啥

          wyb4993:

          我有一個自動化測試程序,里面有很多LabVIEW全局變量,可以讀和寫。是前一任離職的兄弟留下的。目前運行很正常。

          關(guān)于慎用全局變量的問題,很多編程語言方面的書籍都會提及,NI論壇上有一個長達十幾頁的帖子專門討論的這個問題,非常詳細。
          其中不僅僅涉及全局變量,還提及了許多解決問題的技巧。

          下面我大概翻譯一下其中重要的部分,希望有助于理解如何正確使用全局變量。帖子很長,我需要用幾天的時間陸續(xù)給大家介紹。
          -------------------------------------------------------------------------------------------------------------------------------

          TBOB:

          不止一次地看到人們在抱怨,全局變量是罪惡之源,根本就不應該使用它們。但是我不認為這個結(jié)論是顯而易見正確的。我希望能聽到一次有關(guān)全局變量的嚴肅認真的討論。論壇中的朋友們很多都提到了他們都正在編程中使用全局變量。

          先從全局變量的有點談起。一般來說,全局變量是公認的在各個VI之間傳遞數(shù)據(jù)的有效方法,比起其它方式的全局變量(個人意見)更容易管理,因為假如我們使用了一個簇作為全局數(shù)據(jù),我們沒有辦法確定在何處使用了它們,可能需要自己創(chuàng)建一個文件記錄它們使用的位置。但是全局變量則不然,通過全局變量的右鍵快捷菜單,我們可以很容找到引用全局變量的位置。

          使用全局變量有兩個不利之處,其一,引用全局變量需要創(chuàng)建數(shù)據(jù)的拷貝,這可能會導致潛在的競爭條件或者導致數(shù)據(jù)的丟失。其二,使用全局變量會中斷數(shù)據(jù)流程。

          所以,我對那些反對使用全局變量的人士提出一個問題---你們在應用全局變量時考慮了全局變量是否有效的問題了嗎?

          如果對全局變量只有一個寫入者,而有多處讀取者,您僅僅關(guān)心變量的最新寫入值的情況下,您怎么能斷定不能使用全局變量呢?

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

          Darren:

          全局變量在某些情況下是非常好用的。如果我有一些靜態(tài)數(shù)據(jù),這些靜態(tài)數(shù)據(jù)必須在多個VI中共享,這種情況下,我會使用全局變量存儲這些靜態(tài)數(shù)據(jù)。(所謂靜態(tài)數(shù)據(jù)就是不需要改變的數(shù)據(jù),常量)。最常見的例子是需要給用戶提示的文本字符串。如果我有一個非常復雜的GUI,需要在很多地方向用戶提示文本信息。我會創(chuàng)建一個全局變量VI,把這些字符串創(chuàng)建為全局變量,并且按照字母順序排序(通過設置TAB ORDER)。這樣我們需要在程序框圖中使用全局變量時,直接拖入并選擇我們需要的。這種方法可以很容易使我們的應用程序本地化,因為所有的顯示字符串集中在一個VI之中,而不是散布在各個VI之中,很容易集中處理。

          我另外一次使用全局變量是在一個子面板應用中,因為我的子面板中的VI不需要和主VI交換信息,所以我將子面板VI中的數(shù)據(jù)寫入全局變量,供應用程序其它部分讀取。因為不需要同步化以及只有子面板中的VI寫入數(shù)據(jù),保證了只有一個寫入者,這恰恰是全局變量的最佳工作方式。

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

          TBOB:

          很高興能看到同人談及如何恰當?shù)厥褂萌肿兞浚皇呛唵蔚卣f完全不要使用全局變量。我們更應該強調(diào)如何恰當?shù)厥褂萌肿兞浚瑤椭藗兞私鈹?shù)據(jù)競爭是如何產(chǎn)生的,以及如何避免競爭情況出現(xiàn)。

          我大多數(shù)使用全局變量時,是把全局變量作為常量來使用的,比如保存一個GPIB的地址。它們一旦創(chuàng)建后就永遠不會再次寫入更改,這種情況下,絕對不會出現(xiàn)數(shù)據(jù)競爭的情況?;蛘咴谏a(chǎn)消費者模式中,生產(chǎn)者寫入全局變量,而消費者讀取全局變量。這種情況下,讀的時機是非常重要的。我使消費者不斷查詢?nèi)肿兞浚欠窈驮瓉淼闹蛋l(fā)生變化。換句話說,消費者在數(shù)據(jù)更新之前可能讀取了兩次,當然并不很理想。

          對于局部變量也是如此,總有它們合適使用的場合,但是必須小心可能會導致的問題。教會人們發(fā)現(xiàn)問題和解決問題好于僅僅說避免使用它們。

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

          Jasonhill:

          我也經(jīng)常看到要求禁止使用全局變量,在合適的條件下,使用全局變量還是非常有用的。但是程序員還是會不自覺地傾向于濫用它們,任何變量(全局變量、局部變量、LV2全局變量)在使用時需要格外小心,“連線”還是最安全的。

          我非常討厭上下或者左右堆積大量的控件,在程序框圖中多達20幾個層疊順序結(jié)構(gòu)中,到處散布一些全局變量或者局部變量。

          至于你提及的生產(chǎn)者消費者模式,我還是愿意使用隊列來完成,使用隊列可以使我們不需要考慮讀的時機問題。

          -----------------------------------------------------------------------------------------------------------------------------T

          TBOB:

          在生產(chǎn)者消費者模式中,使用隊列(我也傾向于使用隊列,而不是變量)同樣存在問題。消費者可能運行速度高于消費者,此時可能讀回空數(shù)據(jù),必須在編程中檢查是否是否讀回空數(shù)據(jù)。

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

          TST:

          在生產(chǎn)消費者模式使用隊列時,我愿意使用超時的默認值-1,這意味著消費者在沒有數(shù)據(jù)時不會執(zhí)行一個循環(huán),也不需要檢查超時是否發(fā)生了。

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

          TITOU:

          真是個好題目!

          全局變量是魔鬼嗎?------我愿意這樣回答:不是,只要你遵循了全局變量的工作規(guī)則。

          我經(jīng)常建議避免使用全局變量,但是的確在特定的場合,我還是會使用全局變量,因為使用全局變量的確非常方便。

          使用但不要濫用。

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

          ROBERT:

          即使在基于文本的編程語言中,采用封裝和抽象本身就傾向于不使用全局變量。理想的結(jié)構(gòu)應該是這樣的,如果函數(shù)需要一個變量,必須從函數(shù)的調(diào)用者哪里接收這個變量。盡管如此,即使在這樣的編程環(huán)境中,還是需要有限度的和合理的利用全局變量。正如上面的帖子中指出的那樣,一個寫入者,多個讀取者。亦或需要在整個程序應用,但是不需要改變的場合。

          我經(jīng)常采樣下面的方式。在程序啟動時,先運行一個配置函數(shù)或者“參數(shù)設置”函數(shù),此時沒有其它的進程工作,數(shù)據(jù)采集也尚未進行。此時為程序的其它部分創(chuàng)建全局變量是合理的。


          上一頁 1 2 下一頁

          關(guān)鍵詞: LABVIEW全局變

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();