[LabVIEW程式技巧] 快速理解各個同步程式技巧 : Queue、Notifier、Semaphore、Rendezvous、Occurence、First Call
<source : greatway9999>
Queue
(一)、Obtain Queue
Queue類似件包裹功能。特性如下 :
- 具有一對一特性。
- 可命名,易複製。
- 可跨程式傳遞資料。
- 有緩衝空間。
- 不容易掉資料,也不會重複取得資料。
使用關鍵 :
- max queue size,向電腦要最大的記憶體空間。(避免執行過程中記憶體爆掉)
- name : 要取名,若無特殊用途(Obtain Queue如果再新增一個,取同樣名字,會開一個新通道,目的在節省接線,下面有相關範例),最好不要重複。
- element data type : 告訴電腦要什麼樣資料型態的記憶體位置 (也就是要多大)。
- 資料先進先出(FIFO),所以資料會一直往後面塞。
(二)、Enqueue Element
Enqueue Element彷彿是郵局,接收 Obtain Queue送來的資料,再發出去。
使用關鍵 :
- queue out : 傳記憶體位置。舉例,今天買了一棟房子,獲得地址,邀請友人來,就要告訴對方地址。
- timeout : 若對obtian queue有設定尺寸,建議在timeout設定時間,確保程式不會卡住。沒有設定 (預設) 為無限久。
※通道用完一定要關掉。
(三)、Enqueue Element At Opposite End
用法類似唱TV時的插播。插入的資料會放到第一筆。
(四)、Lossy Enqueue Element
Lossy Enqueue : 依照FIFO原則,將第一筆資料先丟掉,再最後方塞入指定資料,保證空間中的資料是最新。舉例來說,就好像是球隊要簽下明星球員(最新資料),但因為位置有限,只好揮棄一位球員(最舊資料)。
(五)、Dequeue Element
接收queue 的資料。
使用關鍵 :
- timeout : 看狀況設定。沒有設定 (預設) 為無限久。
(六)、Preview Queue Element
用法看一眼最前面的資料是什麼,但不會拿走。和Dequeue不一樣。
(七)、Get Queue Status
查看queue中的資料狀態,有多少還沒被拿走。
(八)、Release Queue
釋放queue記憶體空間,把記憶體空間還給電腦。就好像把垃圾車賣掉,就沒有垃圾車可使用。
※通道用完一定要關掉。force destroy要接True,把所有通道關掉,以利把空間還給電腦。
(九)、Flush Queue
清掉記憶體空間的內容,但空間仍在,仍可繼續使用。就好像垃圾車把垃圾倒到焚化爐,但車仍在,可繼續使用。
(十)、Queue實作範例
Obtain Queue省線接法
Notifier (類似廣播)
特性如下 :
- 具有一對多和多對多特性。
- 可命名,易複製。
- 沒有緩衝空間,有可能掉資料。
- 不保證對方會收到資料。適用於不重要的資料傳輸。
- 用法和queue一樣,但不用設定大小。
- 沒有timeout。
(一)、Cancel Notification
就好像line將訊息收回,但是已看到訊息的對象,無法清除記憶。
用途 : 若資料有時效性,就會用到。
(二)、Get Notifier Status
回報現在有多少地方在等待通知,簡言之就是現在有多少人在等待我(發送資料的程式)通知。
Semaphore (紅綠燈)
用於動作互卡。我走完,再換你走。
使用關鍵 :
- 可以取名字 (代表可以省線,參考queue做法)
- size : 設定取決於有幾個迴圈的資料。
實作範例 :
從實作範例中可看到,上面迴圈執行完後,下面迴圈才會接著執行。
Rendezvous (匯合)
同步不同速度的迴圈。
直白地說,多個程式要一起跑完,才能再跑第二圈。也就是說執行快的迴圈要等待執行慢的迴圈,2個迴圈都執行完第一圈,才能執行第二圈。
使用關鍵 :
- name : 命名,省線用途。
- size : 要等待的迴圈數量。
範例 :
Occurence
作為簡易訊號傳送使用,用於只觸發事件,而不傳遞資料。可想像成不能傳遞資料的Notifier。
範例 :
當上面的迴圈中數字整除,觸發下迴圈計數。
First Call
只會呼叫1次,執行其他次數都是False。可作為一次性信號使用。若作為子程式使用,仍只會運作一次。
範例 :
將上述程式轉成子程式,再寫一隻程式進行測試。你會發現,數字更新一次後就歸零。驗證了,呼叫第一次為 True,其餘次數為False。
---
#Queue #Notifier #Semaphore #Rendezvous #First_Call #Occurence
0 留言