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

評(píng)論