2015-06-08 50 views
1

我有一個接收兩個引用路徑作爲輸入的子。 該子項目是根據第一個項目改變第二個路徑的值。 (它添加了用戶選擇的文件夾)可以認爲第一個路徑引用是真正的輸入,第二個是輸出。 (認爲​​C:將指針傳遞給應該由函數修改而不是返回值的東西)如何觸發子變量中的值更改事件,該事件引用了可能的更改值?

說我插入根目錄,vi將子目錄寫入第二個路徑引用。

"/" -> subvi -> "/subdirectory/" 

這工作正常。

現在我想將這些子VI鏈上的兩個在一起,使用戶可以選擇一個文件夾結構的兩層,就像這樣:

"/" -> subvi1 -> "/subdirectory/" -> subvi2 -> "/subdirectory/subsubdirectory/" 

只是要清楚:本是同子VI,二手在子面板中的同一個主vi中兩次。

連鎖vis不按預期工作。 每個子項都註冊第一個路徑引用的值更改事件。我這樣做的動機是通知任何後續的子實例,其根路徑的值發生了變化。

subvi1中進行的更改應該反映在subvi2中,以便subvi2在subvi1中選擇的路徑上運行。 更改事件不會觸發。並沒有反映出subvi1的變化。

這是因爲我有路徑引用作爲輸入?向他們添加一個值變化事件意味着引用必須改變才能引發它,事實並非如此。如果是這樣,如何添加一個更改事件到引用引用的內容而不是引用本身?

我過度使用參考? 我應該只使用路徑而不是路徑的引用嗎?

請看看下面的圖片,它顯示瞭如何創建兩個子視圖並將其推入到子面板中。

code

而且一些更多的信息,我希望這有助於。

每個子視圖只是爲它接收的第一個路徑引用的更改事件添加一個案例。

當通過參考設置您的值時使用值(信令)。這種價值變化會產生價值變化事件。 並通過值(信令)將結果寫入第二個參考。 我懷疑這是問題出在哪裏,因爲它改變了引用內容的值,而不是引用本身。

值更改事件從不執行。

LabVIEW沒有引用路徑。我假設你是指一個路徑控件的引用(它也跟蹤你正在談論的值變化事件)。

好的,我濫用術語。我很抱歉有任何混淆。是的,我的意思是對路徑控制的引用。

如果您確實需要將消息作爲消息傳遞(例如,如果您有並行進程),我會建議使用其他機制,比如用戶事件,而不是值更改事件。 VC事件可以工作,但它們是爲UI使用而設計的。以編程方式使用它們可以使你的代碼變得複雜。

我確實需要這個並行,因爲我有2個子。這是多麼的複雜?我通過了一個即將改變的參考,就是這樣。 If the information should go the other way, from main, to subvi, the suggested solution from national instruments is also to pass a reference as can be seen in this tutorial.

你只在登記事件後,已經發生了

我不知道這是如何,因爲這兩個子VI堅持主。我可以反覆點擊它們,這應該反覆發生變化事件。

+0

它可能會使它更清晰一些,包括你試過的代碼片段 – Swinders

回答

0

LabVIEW沒有引用路徑。我假設你是指一個路徑控件的引用(它也跟蹤你正在談論的值變化事件)。我肯定會說直接使用路徑會更好。利用LV不需要傳遞參數來從函數返回多個值的醜陋事件。如果你能做到的話,價值往往會在數據流中更好地工作。如果你確實需要傳遞消息(例如,如果你有並行進程),我會建議使用其他機制,比如用戶事件,而不是值更改事件。 VC事件可以工作,但它們是爲UI使用而設計的。以編程方式使用它們可以使你的代碼變得複雜。

這就是說,沒有代碼就不可能確切地說出你的問題是什麼,但根據你的描述我最好的猜測是你只在事件發生後才註冊,所以它不會被添加到隊列中第二個VI,但這只是一個猜測,因爲你的描述不是很清楚。

一般來說,對於這些問題來說,更好的地方是NI論壇(如果這對你沒有幫助,並且你在那裏發佈,你肯定會希望包含代碼)。

作爲最後一點,您沒有註冊參考值的更改。將引用連接到寄存器節點將始終爲您提供註冊參考點(在此情況下爲路徑控制)的對象事件的選項。

+0

謝謝你,我比其他任何論壇都更喜歡SO。我編輯了我的問題以提供更多信息。請您詳細說明您提到的「註冊節點」是什麼?它是否可以在我鏈接的教程中看到註冊節點?謝謝 – max

+0

寄存器節點的確確實實施了這個訣竅,爲什麼註冊動態地不同於「靜態地」,正如我之前做的那樣?如果可能,請詳細說明差異嗎?謝謝 – max

+0

SO對某些事情很好。詢問這些類型的LV問題不是其中之一。這裏有一些原因: 1.這裏沒有太多的LV用戶。 2.如果沒有它,您不能進行評論,無論是保存編輯還是進食換行。 3.你不能附上實際的代碼。 4.這種類型的事情通常需要討論,這是明確的SO沒有設計做。 5.編輯現有內容對於某些事情是很好的,但是當你試圖解決這種問題的時候非常糟糕。 總之,我會建議使用NI論壇並附上實際的代碼。 – Yair

0

使用Value (Signalling)當通過引用設置您的值時。這種價值變化會產生價值變化事件。

然而,總的來說,它似乎對我來說是一個奇怪的架構,雖然沒有看到代碼和要求很難說。

0

據我所知,你的代碼中有一個競爭條件 - 你並行地啓動VI,所以沒有告訴他們將以什麼順序運行,並且有可能在另一個得到之前更新寄存器。

這是假設它甚至是兩個獨立的VI,正如你的文字所暗示的。看着你的圖像,我會猜想它是相同的VI,在這種情況下,VI不能並行運行,因爲你使用的是靜態引用,所以即使VI是可重入的,你也會得到相同的實例。如果你只是拿了VI並用不同的名字創建它的副本,我建議你閱讀可重入的VI以及如何動態地啓動它們。

+0

這是相同的子。它是並行執行的。他們一直在跑,所以沒有比賽條件。它們可以重入並且可以工作。我有兩個顯然獨立的子實例。從我的結果中我不得不說這個答案是錯誤的。 – max

+0

正確。我確信這是行不通的,但是一個快速測試似乎表明它們並行運行,即使預先分配了重入。我不知道爲什麼我想到你必須創建一個動態參考。無論如何,你仍然可能遇到我談到的競爭條件,而且沒有實際的代碼很難說清楚。 – Yair