很多時候在一個VI的不同線程或者不同VI的不同線程中需要有一些交互——這些線程并不能完全獨立運行,需要一定的數據通信才能正確執行,這時就需要在編程時使用LabVIEW提供的數據通信與同步的一些機制,使需要傳遞的數據可以在多個線程之間流通,這樣才能使程序按照正確的預期來執行。
本篇文章小編會跟大家講解一些常用的數據通信與同步的方法,歡迎大家來一起交流討論!
本文教程:
LabVIEW多線程編程數據傳遞
首先我們要知道用戶一般是想在兩個并行的循環中傳遞數據,而不是串行執行的循環,那么什么樣的循環是串行執行的,什么樣的循環是并行執行的呢?
串行執行循環:
循環之間有隧道連線,并且由于這個數據線的串聯導致LabVIEW數據流執行兩個循環時串聯執行,只有當前面的循環執行結束后,后面的循環才會開始執行,這就是串行執行的循環。
并行執行循環:
循環之間可以同時獨立運行,循環之間不存在影響LabVIEW數據流并行執行兩個循環的隧道連線。
圖中的兩個循環采取了可以打破數據流的“局部變量”來進行數據的通信,這種方式可能會帶來競爭的危險,所以一般不推薦大家作為多線程中傳遞數據的首選方法。接下來小編給大家列舉一些多線程之間數據通信常用的方法。
一、隊列:
一般來說,當需要在不同線程之間進行通訊或同步的時候首先要考慮的方法絕對是隊列,因為隊列操作簡單高效,隊列傳遞的是地址而不是值,在大量數據傳輸時有很高的效率且不會占用過多內存開銷。
在掌握了隊列操作的API之后就可以非常快速地搭建一個多線程之間的數據傳輸架構,最基礎的多線程軟件設計模式—生產者消費者模式就是使用隊列搭建的,事實上一些耳熟能詳的軟件架構比如QMH架構、JKI狀態機、AF架構等,它們在多線程中傳遞數據的模塊查找到最底層也都是使用隊列封裝出來的。
下圖是LabVIEW自帶的設計模板,它就是使用隊列搭建的一個簡單的生產者消費者架構,使用隊列來在兩個線程之間傳遞數據。
二、通道連線:
從LabVIEW 2016開始新增了可以在并行代碼段之間異步傳遞數據的“數據線”,也稱為“通道連線”。LabVIEW提供了多種通道模板(串流、Tag、消息器等),每種模板表示不同的通信協議,可以根據應用程序的通信需求選擇模板。
串流只支持單輸入單輸出,它是緩沖先進先出數據的一對一消息傳輸(類似于單條隊列),Tag雖然可以支持多個寫入和讀取,但是多個寫入方之間會產生競爭,讀取方只能讀取到最新寫入的那個數據,它是單個值數據的N對M消息傳輸(類似于一個緩沖區大小為1的有損耗隊列)。消息器可以支持多個寫入方和讀取方,它是按先進先出順序的緩沖命令類消息的N對M消息傳輸(類似于多條隊列并行)。
如需創建通道線,首先應創建寫入方端點:右鍵單擊接線端或類型,選擇創建?通道寫入方。從寫入方端點的通道接線端繪制通道線并創建讀取方端點:右鍵單擊通道線,選擇創建?通道讀取方。
通道線在代碼段之間傳輸數據的方式與引用句柄或變量相同。但通道線所需的節點數少于引用句柄或變量,并且使用可見的連線直觀表示數據傳輸。
上圖是一個使用通道連線的范例,可以在兩個并行循環中傳遞數值數據,除了數值類型以外,通道連線還可以接受LabVIEW中存在的任何數據類型,例如字符串、枚舉、路徑、波形、布爾值、簇、數組、對象等。
注意事項:
1、不要組合使用常規連線和通道連線連接循環;
2、通道不是數據,不可以放入數據容器中;
3、通過在寫入端點上設置緩沖區大小來限制緩沖區;
4、使用串流通道時,消費者循環的速度必須高于生產者循環,如果生產者循環比消費者循環運行更快,會占用大量內存(未設置緩沖區大小時);
三、功能性全局變量:
相信大家對LabVIEW中的局部變量和全局變量都有一定的了解,它們分別可以在單個VI中或者單個應用程序的所有VI中傳遞數據。它們使用十分方便,導致很多用戶對它們使用十分頻繁,可是一旦使用不當,就會產生競爭,進而導致數據錯誤傳遞,產生未預期的結果,這種錯誤很難排查。而使用功能性全局變量可以更加安全地在多個線程之間傳遞數據。
功能性全局變量其實是一個VI,它既可以實現全局變量的功能又可以避免競爭,所以在某些傳遞數據的需求中可以用它來代替全局變量使用。一個功能性全局變量必須具備:1、只循環一次的循環;2、未初始化的移位寄存器;3、指定動作輸入參數的枚舉;4、設置為“非重入VI”。
如上圖所示,這是一個很簡單的功能性全局變量,它可以用來在不同調用方中傳遞一個雙精度浮點數據。只循環一次的循環可以讓這個功能性全局變量每次被調用只執行一次對應動作,未初始化的移位寄存器可以使全局變量中始終保存上次動作結束后的值而不被初始化掉;指定動作輸入參數的枚舉可以指定不同調用方執行數據的讀取或寫入。通常功能性全局變量都會設置為非重入執行,這樣可以保證它被調用時始終按照被調用的順序來執行,從而避免引起競爭。
四、用戶事件:
用戶事件屬于動態事件的一種,它可以在不同的VI中傳遞一些自定義的數據,所以我們在多線程編程中可以使用它在不同線程中傳遞數據。小編之前寫過一篇給關于動態事件的文章,對這種方法感興趣的小伙伴可以參考下面的鏈接學習如何利用用戶事件傳遞數據:
總結:
除了文章中介紹的這四種數據傳遞方法之外,LabVIEW其實還有很多其他多線程之間的同步機制,比如網絡流、通知器、共享變量、信號量等,由于篇幅所限,在這就不過多贅述了,感興趣的小伙伴歡迎留言討論!
以上就是有關LabVIEW多線程編程第二章節的所有內容啦,系列文章淺談LabVIEW多線程編程的內容分享結束,歡迎大家一起交流探討!
-
LabVIEW
+關注
關注
1974文章
3656瀏覽量
324289 -
編程
+關注
關注
88文章
3627瀏覽量
93810 -
多線程
+關注
關注
0文章
278瀏覽量
20016
原文標題:知識分享 | 淺談LabVIEW多線程編程(二)
文章出處:【微信號:華穗科技,微信公眾號:華穗科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論