2010-09-17 17 views

回答

3

要向控件寫入一個值,需要從中創建一個局部變量(右鍵單擊程序框圖上控件的終端並選擇「創建」>「局部變量」)。要讓它更新For循環的每個迭代,將局部變量終端放在For循環中,然後將想要顯示的任何內容連接到該終端。我不確定這是否會成爲一個好的用戶界面設計,但它是您的問題的答案。

您還可以使用局部變量從程序框圖中的多個位置寫入指示器,並從指示器或控件讀取指示器。對於任何給定的控制或指標,您可以擁有多個本地變量終端。每個本地變量終端用於讀取或寫入 - 右鍵單擊​​本地變量,然後選擇更改爲讀取或更改爲寫入。

你應該小心使用本地變量來傳遞數據,因爲程序流將不再像數據流一樣通過數據流進行控制,而這可能會導致不可預知的行爲(競爭條件) 。如果讀者在執行時只需要知道當前值,就可以在一個地方寫入並在多個地方讀取,因此寫入來自多個地方的指示器僅用於向用戶顯示信息。

3

是否有任何特定原因需要經常更新控件?
如果需要定期更新,可以將其更改爲指標。
如果您更新的控件經常會讓用戶感覺他不在'控制中'。

+0

@ Ton:它只是爲了學習...我認爲沒有辦法顯示控制數據。 – 2010-09-20 03:33:40

1

我同意噸。如果您正在以編程方式更改控件的值,那麼您應該考慮它是否應該是一個指標,或者可能是控件的僞指標。

這是一個好主意,發佈一個獨立版本的代碼,以便我們可以瞭解究竟發生了什麼。

1

如果您想要維護數據流來控制程序流,您可以改爲使用控件的屬性節點並設置「Value」屬性。

要創建屬性節點,請右鍵單擊程序框圖上的控件終端,然後選擇創建»屬性節點»值。現在,您可以通過使用錯誤導線來控制程序的流程,從而堅持數據流編程。

再一次,爲了重新強調Ton的觀點 - 如果您要頻繁更改控件的值,可能需要將其改爲指標。

+1

您可能想避免使用Value屬性節點,因爲它們有一些不太明顯的性能影響。例如,參見http://forums.ni.com/t5/LabVIEW/local-vs-property-node/m-p/321755。 – 2010-09-22 02:36:52

+0

這只是「維護數據流」,因爲您可以在屬性節點寫入後強制執行相同VI中的下一個操作。它不會影響讀取該控件的代碼是否獲取您剛剛寫入的值或舊值 - 這是不確定的。始終檢查您是否可以使用更好的解決方案,如通知程序或隊列而不是值屬性節點。 – nekomatic 2010-09-30 13:05:01

+0

...我想你可以使用Value(Signaling)屬性,並在控件的值更改上觸發一個事件,但是隻是重新創建通知器,只會導致性能下降。 – nekomatic 2010-09-30 13:08:35

2

如前所述,您可以使用局部變量和常量節點來設置控件或指標的值。如果您試圖堅持數據,那麼有更好的辦法。

谷歌「功能全球」或「labview 2風格全球」。基本模式是使用硬編碼的while循環在一次迭代後停止。添加一個單位移位寄存器。在循環內添加一個case結構。使用控件(布爾,枚舉或字符串)在案例結構上進行選擇。在你的VI中放置一個相同數據類型的控制/指示器對。將指示器連接到環路外部右側移位器的外部輸出。將控制INSIDE循環放置在「set」(通常是true,非默認)的情況下,並將其從案例中導入到右移器的輸入中。轉到其他空殼體並將左移位器的內部輸出通過殼體連接到連接到內部輸入的端子。

因爲你沒有連接左移位器的外部輸入,它是一個「單位移位寄存器」。它會將最後一次調用的數據保存到VI中。這就像在c函數的堆中聲明一個變量,並在下一次函數調用時爲您提供最後一個賦值。

三個主要好處是保存數據流,線程安全和性能。您可以通過將錯誤IO添加到VI來獲得數據流。確保線程安全,因爲VI的執行保證是原子性的。由於LV數據希望生活在電線上,性能得到改善。每次將數據寫入控件的proerty節點時,LV運行時都會將該數據寫入UI線程。我認爲對於當地人來說也有類似的基於線程的性能打擊,但我不確定。


每第一條評論...

從此處的鏈接複製爲您的利益(是的,你閱讀器先生)。 問題: 我正在考慮使用本地或全局變量;變量在什麼線程中執行?

解決方案: 一個常見的誤解是局部和全局變量操作執行的UI線程,或者需要一個線程交換到UI線程 - 這是不正確的。下面描述本地和全局變量寫入和讀取操作的行爲:

寫入: 當您寫入本地或全局變量時,LabVIEW不會立即切換到用戶界面線程。而是將LabVIEW的值寫入傳輸緩衝區,傳輸緩衝區是內存的一個受保護區域。用戶界面在下次計劃的更新時間更新。在單線程切換或用戶界面更新發生之前,可以多次更新變量。這是可能的,因爲變量僅在執行線程中運行。

閱讀: 當您從本地或全局變量讀取,將發生在其VI執行,因此線程操作,可以確保它不會在UI線程通過在設置執行系統發生VI屬性轉爲標準。有一個線程保護機制可以確保全局的編寫者在讀取數據時不會改變數據,但這是通過互斥鎖完成的,而不是通過進入UI線程完成的。但是,如果打開全局變量面板,則會發布一條消息以重繪全局控件,並且重繪將在UI線程中發生。


nekomatic是正確的。當你寫給當地人時,線程交換不會發生。

+0

當地人不強制切換到UI線程 - 請參閱http://digital.ni.com/public.nsf/allkb/A8EE12F2D6A232C586257150007A0E19。 upvoted爲功能全局的一個很好的解釋! – nekomatic 2010-09-30 12:58:51

+0

@nekomatic感謝+1。 – dFlat 2010-10-07 20:15:49

相關問題