labview棧和隊列
同步控制技術----棧與隊列 本文引用地址:http://www.104case.com/article/201701/337150.htm(其中有很多圖片不是馬上就能看到的,查看方法是:鼠標右擊不可看圖片,選擇復制圖片地址,然后在瀏覽器中打開即可。因為本文是摘錄的,給各位朋友帶來不便,請多諒解!) |
在計算機編程中棧是一個很重要的概念,尤其在匯編語言中,需要不斷進棧和出棧的操作.棧是限定在一個表的尾端進行插入(進堆棧)和刪除(出堆棧)的線性表.是后進先出結構(LIFO). 隊列的定義和棧的定義是類似的,區別是數據是先進先出(FIFO) labview還有一個概念緩沖區BUFFER,典型的比如CHART,它默認保存數據長度是1024.BUFFER的概念和隊列是非常相似的,都是一個先進先出的結構.如果我們設定隊列的數據長度也是1024.比較一下他們的區別. 區別一:未達到設定 開始的時候,隊列和緩沖區中都是沒有數據的,當有數據進入的時候,隊列和緩沖區中的數據在不斷地增加,對于緩沖區,因為未達到它最大許可的長度 1024,因此數據是不斷第增加的,隊列則不同,它的數據是否增加取決于是否有讀隊列的過程,就是所說的出隊,如果出隊的速度大于入隊的速度,隊列中則根本不會有數據.如果沒有出隊的過程或者出隊的速度小于入隊的過程,隊列中的數據也是不斷地增加的.這是第一個區別. 區別二:到達設定值 當隊列和BUFFER都達到了1024個數據后,這是再有新的數據要進來,隊列和BUFFER的表現是不同的,對于BUFFER,它將自動擠出(形象的說法,當然也是編程實現的)最早進入BUFFER的數據,所謂先進先出.而隊列則不同.要求進入隊列的線程只能被動等待,一直到隊列中有別的線程取出數據,隊列中有空閑位置.所以隊列有調節讀寫速度線程的能力. 相同點一:數據進入都是在尾部,(隊列插入如果在頭部,就編程上面所說的棧了) 相同點二:對于中間數據都實現了有效的封裝,你無法直接提取中間的某個數據,你可以讀出中間的數據,但是不能改變當前BUFFER和隊列的值. LABVIEW提供的隊列的功能函數(包括棧),在逐點分析庫提供了DBL型的BUFFER,我在另外的日志中專門提到了,這里就不多說了. LV隊列的函數是基本函數,無法進行深入跟蹤,估計應該是采用C++的算法然后封裝的,我實際測試過,它的運行效率遠高于用數組的方式構成的隊列,為了詳細說明隊列和棧的細節,我還是用數組的形式,然后在介紹LV的隊列函數. 首先看看如何用數組實現棧的功能: 棧的操作是非常簡單的,只有壓棧和出棧兩個操作(PUSH AND POP) 我們用AE來實現它.分成三個action: Init,Push ,Pop 首先嚴格自定義ENUM,表示三個動作. |
這樣我們就完成了棧的AE的制作過程。
看看它的調用過程。
10次循環,棧中的數據應該是0,1,2,3,4,5,6,7,8,9。棧的彈出次序應該是9,8,7,6,5,4,3,2,1,0
運行結果確實如此。
與棧相反,隊列是一個先入先出的數據結構,我們對棧的過程稍微修改一下,就可以得到隊列。就不多介紹了。下面重點介紹一下LV提供的隊列的具體功能。

分別介紹這8個節點的具體功能:
1:獲得隊列(實際是得到隊列的參考)它有5個數據端子
name:String
隊列在LV系統中是名稱來區分的,LV系統自己維護一個包含的目前所有隊列的表,當你運行這個函數的時候,它首先會查找表中是否已經存在這個隊列參考,如果存在,就直接返回這個參考,如果不存在,就建立一個新的隊列,并將隊列參考加入表中進行維護。這樣做的好處是非常明顯的,允許我們在任何子VI中,只需要知道隊列的名稱就可以運行這個函數直接得到隊列參考,不用通過全局變量或者數據流輸入來得到參考,在一個層層嵌套的VI中想傳遞一個數據很不容易,也不利于模塊化。
評論