<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

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

sandan0615:

本文引用地址:http://dyxdggzs.com/article/201701/337245.htm

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

czhen:

當然可以
不行的話(huà),要它干啥

wyb4993:

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

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

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

TBOB:

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

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

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

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

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

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

Darren:

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

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

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

TBOB:

很高興能看到同人談及如何恰當地使用全局變量,而不是簡(jiǎn)單地說(shuō)完全不要使用全局變量。我們更應該強調如何恰當地使用全局變量,幫助人們了解數據競爭是如何產(chǎn)生的,以及如何避免競爭情況出現。

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

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

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

Jasonhill:

我也經(jīng)??吹揭蠼故褂萌肿兞?,在合適的條件下,使用全局變量還是非常有用的。但是程序員還是會(huì )不自覺(jué)地傾向于濫用它們,任何變量(全局變量、局部變量、LV2全局變量)在使用時(shí)需要格外小心,“連線(xiàn)”還是最安全的。

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

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

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

TBOB:

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

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

TST:

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

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

TITOU:

真是個(gè)好題目!

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

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

使用但不要濫用。

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

ROBERT:

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

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


上一頁(yè) 1 2 下一頁(yè)

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

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>