關於LabVIEW的句柄(Handle)二三事
首先談談比較簡單的」控制項引用句柄」:
使用完必須關閉,否則會內存泄漏。具體的癥狀就是隨著程序的運行,應用程序佔用的內存會緩慢的上升。
當然也有例外:link to Control的控制項由LabVIEW自動管理。
第二點要談的是一個稍微特殊的」資料庫的引用句柄」:
使用完必須關閉,否則會內存泄漏。這一點的相同的,但是頻繁的打開和關閉會造成程序的不穩定,這應該和資料庫的延遲寫入有關(這個比較複雜就不展開討論了)因此比較好的方案是將資料庫封裝成一個功能性全局變數,在初始化時打開句柄,退出時關閉。
第三點也是今天要仔細討論的是」隊列的引用句柄」:
LabVIEW的創建隊列函數:
1:每次調用時先分配內存創建了一個隊列引用,
2A:沒有這個名字的隊列時會創建這個隊列;
2B:假如有同名隊列存在則將引用指向已有隊列並給引用計數加一;
每個引用仍然會分配額外的內存。
銷毀隊列函數:
銷毀隊列引用時還會根據隊列引用計數是否為零決定,只釋放隊列引用還是同時釋放隊列對象本身,當然也可以強制銷毀隊列。
Example:標準生產者/消費者
為了將架構相關的VI單獨封裝,一種常見的Trade off:
將創建隊列、隊列出數據、關閉隊列引用封裝成一個子VI
另外還有一種變體,不關閉隊列引用。
當隊列數量較多時會造成一個問題:
每次創建隊列引用時,都需要去查詢一個全局的隊列對象的列表,包括銷毀時也是,而且這個列表的訪問是有引用計數的,這會造成不小的性能消耗。
而對於不關閉隊列引用的情況還額外會造成隊列引用的內存泄露,最後退出程序時一次性釋放,造成卡頓和失去響應。所以第二種不關閉隊列引用還有一種方式是自己寫一個功能性全局變數,維護隊列引用,每次只查詢不創建,並且可以通過分割模塊控制每個功能性全局變數維護的隊列數量。
然而這種方式過於複雜,不如用LabVIEW的Actor Framework來管理線程。
LabVIEW
2016之所以通過連線傳遞數據通道句柄,應該也是為了避免無意義的隊列創建,不過還需要實際查看程序驗證,下一篇文章準備寫一些相關的東西。https://labview-haoboli.rhcloud.com/?p=363
推薦閱讀:
※如何接手別人的LabVIEW代碼/可執行程序?
※LabVIEW這麼反人類的東西到底哪些人在用?他們看中了LabVIEW的哪些優點?
※LabVIEW與Arduino的Modbus通訊實現
※labview的數據流編程思想是什麼意思?
※推薦一個免費的LabVIEW SVN插件Viewpoint TSVN Toolkit
TAG:LabVIEW |