1 Producer 2 Consumer疑問

您好想詢問各位前輩們,目前剛嘗試用Producer/Consumer方式撰寫程式,以下想把控制程式跟監控程式的迴圈分開,有去爬國外NI論壇資料,並且參考修改成目前的程式,讓兩個迴圈都可以平行運作,只是發現下面Monitor的Deq會卡initialize沒辦法跑Monitor的程式,然後Stop的時候ReleaseQ會跳錯誤。

想請問是哪邊需要修改呢?
1

程式碼的部分
labview.7z (89.5 KB)

稍微看一下,至少有下面三個問題
1.不要隨便漏接線,除非你120%確定不接沒事,不然請不要使用"Use Default If Unwired",Labview已經使用特別的接點圖案提示線沒接了,請想辦法消除所有未接線的提示。

2.當resource一分為N之後,想要close前,請記得等大家集合完畢再結束。

3.Mnitor loop在隨便觸發一個event後就不可能再收enqueue的element,因為producer resource早就不見了,所以永遠只能在timeout後被迫執行Default,而不是你認為的initialIntialize,原因是因為你沒接線加上使用shift register。

建議先熟悉Labview的資料流怎麼流?先後順序怎麼看?什麼時候才該用shift register?什麼是race condition?再來挑戰多個迴圈,不然永遠會有你想不到的錯誤產生,因為你還無法預期程式會怎麼執行,這是需要由簡到繁的練習累積的,除非天賦異稟。

下面是標準如何在多個迴圈下release queue的模型,必須由producer發起,consumer收到,再等待同時結束並release,如果要使用其他方式,除非你非常清楚你的程式如何運作。
image

問題一:Stop會跳錯誤是因為你在Event Loop迴圈後面直接接Release,你可以用燈泡去看,很有可能你的子迴圈根本還沒有離開Loop你的Event後面的Realse就把Queue給釋放掉了


有一個建議是你可以用Merge Error元件將所有迴圈的錯誤線接再一起,確保所有迴圈都離開之後,在執行Release,Error線不只可以用來判別錯誤,也可以透過LabVIEW所有輸入點到才輸出的特性,利用Error線去控制你的資料走向

問題二:


Queue接收資料,把資料輸出,一個輸入就一個輸出,你在這裡你只給Queue下一個Stop指令,所以你的Queue就算沒釋放掉,我覺得你的程式也很有機會不能停止,因為你的兩個子迴圈很可能只有一個會接收到Stop的指令,另外一個就會卡在等待Queue的狀態之中

問題三:還有一點我覺得怪怪的是,你Monitor的狀態只有在Event Timeout的迴圈會下,那其他指令在執行時,你的Monitor迴圈應該在執行不同Event時都會被判斷在Default,因為都沒有對應的狀態可言

以上是我覺得可能有問題的狀況,如果有講錯可以跟我說XD,然後我覺得如果之後程式需要控制儀器跟同步儲存資料的話,可以考慮用Notifier跟Queue再搭配FGV去做編程,或是有的程式類型我覺得Notifier控制比Queue方便,另外一點是要寫多平行程式建議你可以去看看FGV要怎麼寫,我覺得對於寫程式蠻有幫助的。

問題一:我在stop event裡面給另一個迴圈也下達Stop指令後,Release就不會跳錯誤,看來是子迴圈結束才Release。

問題三:我也覺得很奇怪,主要是才剛接觸Labview算一個月多吧,所以爬了很多文章都說新手建議不要使用Variable破壞資料流,我目前對資料流的型態也還沒有到真的很熟悉,所以要求自己都先不要使用Variable,關於Notifier我會再參考看看,不過目前的程式上是Monitor的子迴圈都不會運作還沒抓到是哪裡出了問題。

謝謝你的建議

我來雞婆一下XD
針對Q3 local variable 其實不是不能用,
資料流這概念跟高鐵沒兩樣,
要從高雄到台北一定會經過台中站(不換車的條件下)
所以資料沒有到台中就不可能到台北,
相對的 variable 就像影分身之術,
定義好後,不管台中有沒有到站,台北一定就會有資料,
用起來很方便,但常常很多資料都要丟給台北站,沒搞好先後順序才會有race condition,
重點在於定義誰可以用variable,先後順序…等~
希望以上可以給你有所幫助

2個讚

現在程式撰寫能力還沒到很成熟,常常沒搞好先後順序就會race condition所以選擇直接避開XD
不過現在主要問題還是Queue在第二個迴圈的問題,如果把Event裡的timeout上面


這部分不要連接在一起下面是迴圈是可以測出Monitor的,但變成上面的迴圈就沒正常運行,下面Monitor監測狀態也不會有數據,超奇怪哈哈