使用notifier取代local variable傳遞變數

各位前輩

在使用notifier取代local variable在even structure中傳遞變數,避免local variable佔用資源或是race condition...等等,但是遇到問題,在event structure中button 2是wait notifier傳送變數給number2,但是連按2次button2會導致當機,只能強制中段程式,其他button1,button3這2個send notifier則不會有連按2次當機的狀況,請問當機的原因和解法?

notifier.vi

 

“Wait Until Next ms Multiple” 一般應該設100才有功用,10太快了!很佔CPU

1. 用Event Structure的話 那個 Timing (兩個回圈都是)就可以省下來的,你用反而是消耗CPU資源

2. Button2 按兩次會當機是因為第一次按時有資料丟給 Wait on notification,第二次按時已經沒有資料給Wait on

   notication,所以程式一直在等資料(資料流概念),所以造成類似當機現象。

3.基本上這種寫法就是違反資料流得概念,你在想一下囉,應該不難。

1.timing問題我再測試看看@@

2.這邊可以看到程式持續都有用下面的迴圈丟出資料,但是按下button2時,event structure內的wait notifier還是會再丟一次資料,這樣比起來也是不符合一個資料只丟一次的講法,還是蠻奇怪的

3.因為禁止使用local variable和propertity node,同一個變數又要在不同event中或讀或寫,只號嘗試用notifier, queue也可以,我還沒仔細試過,請問還有其他方法嗎?

不知道你原來的問題為何,所以不知如何建議起

你把Event Structure 中 Buttom2 Event 的 Wait on notification 刪掉

換一個數字常數(設成123), Error line 連過去

然後執行起來就跟你的原程式效果一樣  而且不會當機

如果這結果不是你要的  那就請POST原問題了

 

[QUOTE=Markaa]

1.timing問題我再測試看看@@

2.這邊可以看到程式持續都有用下面的迴圈丟出資料,但是按下button2時,event structure內的wait notifier還是會再丟一次資料,這樣比起來也是不符合一個資料只丟一次的講法,還是蠻奇怪的

3.因為禁止使用local variable和propertity node,同一個變數又要在不同event中或讀或寫,只號嘗試用notifier, queue也可以,我還沒仔細試過,請問還有其他方法嗎?

[/QUOTE]

題目是在不用local variable和properity node下如何使一個變數既可以讀又可以寫.

例如設定一個indicator,程式一開始時先將這個indcator設定為123,而後又要因為不同程序(事件)將這個indicator改變為456(button1)和789(button3),這2個都是write,除此之外,button2的意義是要把這個indicator當成是control丟出儲存在這個indicator內的數字來進行運用.

我不知道這樣敘述是否可以傳達清楚問題?

http://zone.ni.com/reference/en-XX/help/371361B-01/lvconcepts/read_write_variables/

原文中變數是用local variable來實現read & write,但是現在被禁用,之前在這邊(還是哪?)看過用notifier減少local variable的使用,所以這個程式的目的在禁止使用local variable和properity node下,可以使變數可讀可寫.

『除此之外,button2的意義是要把這個indicator當成是control丟出儲存在這個indicator內的數字來進行運用.』

這句話看不懂~~可能我的文字造詣不好  

 

 

@@ 我也不知道該如何表達

例如

A=125

A被當成idcator,125被設定給A

A=A+1

這邊第一個A還是被當成indator

第2個A則被當為control

ㄧ般程式語言並沒有像Labview這麼嚴格界定controllor或indicator

所以ㄧ個變數從程式開始就不停的變換二種身分

labview規定嚴格了些

不允許本尊變換身分,但是分身local variable和properity node倒是沒限制

但現在不准使用local variable和properity node,

卻要變換controllor和indicator二種身分的方法

...

講一講好像越講越複雜....我可不是在繞口令阿,只是舌頭快打結了 = =""

這樣說好了....notifier是一個符合資料流架構的資料傳輸方式

它單純地將資料傳遞到另一個迴圈之中

至於資料要怎麼用,就看使用者的需求

你把它接到一個indicator 那它就只是單純顯示而已

你把它當某個物件的input   那它就是一個 control

所以你要把這兩件事分開

 

至於 A=A+1  在Labview 用 Shift register 就解決了

 

看來notifier是可以代替local variable使用,但是只能傳遞一次資料,也有其侷限性,至少我要想其他方法了.....

謝謝你的幫助.

小弟嘗試用你上述的條件寫了一個程式

你參考看看是不是你要的

不過按你的條件  初始值123 僅能在 Buttom1 或 Buttom3 觸發前 以Buttom2 傳送至 To Control

一旦Buttom1 或 Buttom3 觸發,初始值就無法使用了

至少依你的描述是如此    這種寫法有點類似 Functional Grobal Variable

參考參考

 

Test.vi

 

[QUOTE=Markaa]

看來notifier是可以代替local variable使用,但是只能傳遞一次資料,也有其侷限性,至少我要想其他方法了.....

謝謝你的幫助.

[/QUOTE]

@@ 不好意思, 我使用的是labview 8.0, 可以麻煩你幫轉嗎?

 

OK  如附件,123如果還要的話就自己加個Event 進去就可以了

Have a nice day!

 

Test_VER80.vi

[QUOTE=Markaa]

@@ 不好意思, 我使用的是labview 8.0, 可以麻煩你幫轉嗎?

[/QUOTE]

謝謝你的幫忙,之前查到過fuctional global variable,還以為是和global variableㄧ樣,所以就直接跳過,沒想到是不一樣的東西,大致上看了一下,又去查了fuctional global variable的文章,應該是可行,我再去試試其他變數和矩陣.