0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

LabVIEW多線程編程解析 LabVIEW的VI優(yōu)先級(jí)和并行循環(huán)等相關(guān)知識(shí)

華穗科技 ? 來(lái)源:華穗科技 ? 作者:華穗科技 ? 2023-11-10 10:20 ? 次閱讀

軟件開(kāi)發(fā)過(guò)程中總會(huì)遇到需要多線程同步運(yùn)行的情況,尤其是一些復(fù)雜的測(cè)試系統(tǒng)和大型項(xiàng)目,僅靠單線程運(yùn)行的程序是遠(yuǎn)遠(yuǎn)無(wú)法滿足用戶需求的,甚至可以說(shuō)在復(fù)雜測(cè)試系統(tǒng)的軟件開(kāi)發(fā)中,多線程運(yùn)行是最基本的。

所以不論使用什么開(kāi)發(fā)環(huán)境都需要工程師們掌握如何進(jìn)行多線程編程。在多線程開(kāi)發(fā)這一點(diǎn)上LabVIEW有其獨(dú)到的優(yōu)勢(shì),那就是LabVIEW是自動(dòng)并行運(yùn)行的語(yǔ)言,它可以自動(dòng)多線程運(yùn)行。

下面就小編就和大家淺談一下LabVIEW的線程編程的相關(guān)知識(shí)吧!

本文教程

LabVIEW多線程編程基礎(chǔ)概念

一、單線程與多線程:

LabVIEW在5.0開(kāi)始才支持多線程,在此之前,LabVIEW其實(shí)是單線程運(yùn)行的。在了解LabVIEW多線程之前,我們需要了解單線程的含義:?jiǎn)尉€程并不是指代碼固定在某個(gè)線程上一直執(zhí)行,系統(tǒng)有可能也會(huì)將它切換到其他線程上去運(yùn)行,但是在同一時(shí)刻它只會(huì)存在于單個(gè)線程中,不會(huì)有多個(gè)線程去同時(shí)運(yùn)行這段代碼。而多線程指的是在同一時(shí)刻系統(tǒng)可能會(huì)在多個(gè)線程中同時(shí)運(yùn)行代碼。

在LabVIEW中只要程序框圖中的代碼可以并行運(yùn)行(功能模塊之間沒(méi)有連線關(guān)系,比如兩個(gè)獨(dú)立的While循環(huán)),那么LabIVEW在運(yùn)行這段代碼時(shí)就會(huì)自動(dòng)將它們分配在多個(gè)線程內(nèi)同時(shí)運(yùn)行。

一般情況下,LabVIEW運(yùn)行VI時(shí)至少會(huì)開(kāi)辟兩個(gè)線程,一個(gè)是負(fù)責(zé)刷新界面、響應(yīng)用戶操作控件等界面操作功能的用戶界面線程;另外一個(gè)或多個(gè)線程是負(fù)責(zé)執(zhí)行除界面操作以外的其他工作,稱之為執(zhí)行線程。

二、LabVIEW的多線程:

如下圖所示,這是兩個(gè)獨(dú)立運(yùn)行的While循環(huán),這段代碼在執(zhí)行時(shí)會(huì)被LabVIEW自動(dòng)分配到兩個(gè)線程中去執(zhí)行。

d4980e74-7f6e-11ee-939d-92fbcf53809c.png

通過(guò)上面這個(gè)示例就可以看到,在LabIVEW中編寫多線程程序十分簡(jiǎn)便。由于兩個(gè)循環(huán)中沒(méi)有延時(shí)函數(shù),程序會(huì)十分快速地執(zhí)行,所以對(duì)系統(tǒng)來(lái)說(shuō)它們是兩個(gè)較為繁重的線程,一般對(duì)于這種任務(wù)繁重的線程,多核CPU計(jì)算機(jī)還會(huì)將它們額外安排到不同的CPU內(nèi)核上去運(yùn)行。如下圖所示,運(yùn)行上述示例以后系統(tǒng)自動(dòng)將它們分配到不同的內(nèi)核中去運(yùn)行,這樣可以合理利用CPU資源,提高程序運(yùn)行速度,節(jié)省程序執(zhí)行時(shí)間,防止某個(gè)CPU內(nèi)核被100%占用導(dǎo)致卡死。

d4b53ba2-7f6e-11ee-939d-92fbcf53809c.png

三、LabVIEW的執(zhí)行系統(tǒng):

LabVIEW自己有一套調(diào)度系統(tǒng),負(fù)責(zé)代碼的調(diào)度和運(yùn)行,這就是LabVIEW的執(zhí)行系統(tǒng)。LabVIEW目前有六個(gè)執(zhí)行系統(tǒng),分別是:用戶界面、標(biāo)準(zhǔn)、儀器I/O、數(shù)據(jù)采集以及其他1、其他2執(zhí)行系統(tǒng)。一個(gè)應(yīng)用程序中的眾多子VI是可以分別放在不同的執(zhí)行系統(tǒng)里運(yùn)行的,用戶可以在VI屬性中指定VI的執(zhí)行系統(tǒng)。

d4cd80ae-7f6e-11ee-939d-92fbcf53809c.png

在LabVIEW支持多線程后,不同執(zhí)行系統(tǒng)中的代碼就被劃分在了不同的線程下運(yùn)行。其中用戶界面執(zhí)行系統(tǒng)只有一個(gè)線程,那就是一開(kāi)始提到的用戶界面線程;其他執(zhí)行系統(tǒng)可以為代碼開(kāi)辟多個(gè)線程。

四、LabVIEW的VI優(yōu)先級(jí):

用戶可以在VI屬性中指定VI的優(yōu)先級(jí)屬性。LabVIEW VI優(yōu)先級(jí)有后臺(tái)、標(biāo)準(zhǔn)、高于標(biāo)準(zhǔn)、高、實(shí)時(shí)這六個(gè)檔次。其中前五項(xiàng)是從低到高的優(yōu)先級(jí)順序,優(yōu)先級(jí)越高越容易搶占到CPU資源。而子程序這一項(xiàng)比較特殊,當(dāng)一個(gè)VI的優(yōu)先級(jí)被設(shè)置為子程序時(shí),VI前面板、調(diào)試信息會(huì)被移除(不能用作界面、不能調(diào)試),同時(shí)在執(zhí)行該VI時(shí)應(yīng)用程序會(huì)短暫變?yōu)閱尉€程執(zhí)行,即在這個(gè)VI執(zhí)行結(jié)束之前,不會(huì)被別的線程打斷;這意味著子程序的VI在執(zhí)行時(shí)會(huì)得到最多的CPU資源,所以某些純算法的VI,假如不是特別耗時(shí)就可以設(shè)置為子程序的優(yōu)先級(jí)。

d4e6877a-7f6e-11ee-939d-92fbcf53809c.png

在設(shè)置VI優(yōu)先級(jí)時(shí)需要注意:1、在一個(gè)應(yīng)用程序中,提高一個(gè)VI的優(yōu)先級(jí)并不能縮短應(yīng)用程序整體占用CPU的時(shí)間,只是意味著這個(gè)VI會(huì)比其他VI更多、更容易搶占到CPU資源,所有VI占用CPU的整體時(shí)間是不會(huì)變的;2、低優(yōu)先級(jí)相對(duì)于高優(yōu)先級(jí)的VI,并不是高優(yōu)先級(jí)的VI會(huì)一定先執(zhí)行,只是說(shuō)明高優(yōu)先級(jí)VI有更高的概率搶占到CPU資源;

在單核CPU的計(jì)算機(jī)上,LabVIEW最多為每個(gè)執(zhí)行系統(tǒng)下的每個(gè)檔次優(yōu)先級(jí)開(kāi)啟四條線程,如果是多核CPU,每增加一個(gè)CPU內(nèi)核,可開(kāi)辟的線程數(shù)目翻倍。實(shí)際上一個(gè)程序在運(yùn)行時(shí)并不會(huì)有那么多優(yōu)先級(jí)和執(zhí)行系統(tǒng)設(shè)置,所以并不會(huì)開(kāi)辟很多線程。

小編這里提醒大家編程時(shí)線程不是越多越好,因?yàn)榫€程的開(kāi)辟、銷毀、切換等都是需要消耗資源的,如果線程開(kāi)的太多,切換線程太頻繁,反而會(huì)導(dǎo)致程序執(zhí)行的效率降低。

五、定時(shí)結(jié)構(gòu):

對(duì)于多核CPU的計(jì)算機(jī),有時(shí)候操作系統(tǒng)自動(dòng)分配線程至CPU內(nèi)核的策略可能并不是最優(yōu)解,于是就需要我們?nèi)斯とブ付ǎ茨硞€(gè)線程應(yīng)該被指定到計(jì)算機(jī)的哪個(gè)CPU內(nèi)核上執(zhí)行?,F(xiàn)在絕大部分計(jì)算機(jī)的CPU性能都足夠強(qiáng)大,所以一般情況下,只有對(duì)于執(zhí)行效率要求極其苛刻的程序才會(huì)需要我們?nèi)斯とブ付–PU內(nèi)核的分配方案。

需要人工指定CPU分配方案時(shí),我們可以使用定時(shí)結(jié)構(gòu)來(lái)替換程序中原有的結(jié)構(gòu),定時(shí)結(jié)構(gòu)可以更加精確的執(zhí)行某段程序代碼,并且它還包含一些用于高精度定時(shí)、處理器分配等的輔助功能,定時(shí)結(jié)構(gòu)包含定時(shí)循環(huán)結(jié)構(gòu)和定時(shí)順序結(jié)構(gòu),如下圖所示:

d4f743d0-7f6e-11ee-939d-92fbcf53809c.png

可以看到相對(duì)于普通的循環(huán)或者順序結(jié)構(gòu),定時(shí)結(jié)構(gòu)左側(cè)有一些輸入端,可以進(jìn)行一些配置,這些配置可以在程序運(yùn)行過(guò)程中使用輸入接線端進(jìn)行動(dòng)態(tài)設(shè)置,也可以在配置面板中靜態(tài)進(jìn)行設(shè)置,如下圖所示:

d50e55c0-7f6e-11ee-939d-92fbcf53809c.png

在該配置面板中,處理器分配模式就是用來(lái)指定CPU的設(shè)置,可以將它選擇為手動(dòng)模式,然后在后面選擇要分配的CPU內(nèi)核名稱即可。在實(shí)際應(yīng)用中,我們可以將按照?qǐng)?zhí)行任務(wù)的耗時(shí)來(lái)劃分,將耗時(shí)比較多的任務(wù)單獨(dú)指定在一個(gè)CPU中,不同CPU中平衡分配任務(wù),提升程序整體運(yùn)行的速度。

六、并行循環(huán)

前面提到當(dāng)兩個(gè)循環(huán)并行運(yùn)行,它們之間沒(méi)有數(shù)據(jù)連線時(shí)LabVIEW會(huì)將它們劃分到兩個(gè)不同的線程中去執(zhí)行。那么當(dāng)只有一個(gè)循環(huán)時(shí),一般情況下,LabVIEW只會(huì)為此循環(huán)開(kāi)辟一個(gè)線程來(lái)執(zhí)行,但是如果這個(gè)循環(huán)中的代碼本身就比較耗時(shí),那么這段代碼的執(zhí)行效率就會(huì)十分低,如下圖所示:

d5306d2c-7f6e-11ee-939d-92fbcf53809c.png

上述示例中的這段代碼執(zhí)行一次需要859ms,屬于相當(dāng)耗時(shí)的代碼了,它每次循環(huán)都需要經(jīng)過(guò)大量數(shù)學(xué)運(yùn)算,對(duì)于這種循環(huán),可以將它配置成并行運(yùn)行模式,在循環(huán)上右鍵并選擇“配置循環(huán)并行”

d5919cb4-7f6e-11ee-939d-92fbcf53809c.png

選擇之后就會(huì)看到一個(gè)配置窗口:

d59b74d2-7f6e-11ee-939d-92fbcf53809c.png

首先我們需要先勾選“啟用循環(huán)迭代并行”,然后配置生成的并行循環(huán)實(shí)例數(shù)量,一般來(lái)說(shuō)實(shí)例數(shù)最高設(shè)置成計(jì)算機(jī)的內(nèi)核總數(shù)量,設(shè)置數(shù)量超過(guò)計(jì)算機(jī)的內(nèi)核數(shù)量就沒(méi)有意義了,不會(huì)再繼續(xù)提高程序的運(yùn)行速度。

d5b6a982-7f6e-11ee-939d-92fbcf53809c.png

上圖是將原先的示例改為并行循環(huán)并設(shè)置了8個(gè)線程之后的執(zhí)行情況,可以看到它的運(yùn)行時(shí)間顯著減少,程序的執(zhí)行效率得到了很大的提升。

注意事項(xiàng):

1、配置并行循環(huán)要求循環(huán)內(nèi)部的代碼不能依賴之前循環(huán)運(yùn)算的結(jié)果(比如不能使用反饋節(jié)點(diǎn)和移位寄存器),因?yàn)槿绻绦蛞蕾囍把h(huán)運(yùn)算的結(jié)果就表明這個(gè)程序不能并行運(yùn)行,必須強(qiáng)制迭代按順序執(zhí)行,如果強(qiáng)行配置為并行循環(huán)會(huì)導(dǎo)致VI報(bào)錯(cuò)無(wú)法運(yùn)行。

d5c6c920-7f6e-11ee-939d-92fbcf53809c.png

2、配置為并行循環(huán)的程序無(wú)法在循環(huán)內(nèi)部使用探針等調(diào)試手段,如果需要調(diào)試可以勾選配置循環(huán)并行面板中的“允許調(diào)試”,勾選之后它會(huì)強(qiáng)制所有并行的線程按照順序迭代,這樣會(huì)使并行運(yùn)行的執(zhí)行效率降低到之前的單線程運(yùn)行的水平,所以一般代碼調(diào)試完成后一定要記得取消此勾選項(xiàng)。

d5e3fba8-7f6e-11ee-939d-92fbcf53809c.pngd5f4bdd0-7f6e-11ee-939d-92fbcf53809c.png

七、內(nèi)容總結(jié)

1、明確LabVIEW單線程和多線程的概念;

2、了解LabVIEW自動(dòng)多線程的相關(guān)知識(shí);

3、熟悉LabVIEW執(zhí)行系統(tǒng)的相關(guān)知識(shí);

4、掌握LabVIEW VI優(yōu)先級(jí)設(shè)置及其注意事項(xiàng);

5、學(xué)習(xí)定時(shí)結(jié)構(gòu)和并行循環(huán)的使用及注意事項(xiàng);

以上就是有關(guān)LabVIEW多線程編程第一章節(jié)的所有內(nèi)容啦,歡迎大家一起交流探討!下一章小編將會(huì)為大家?guī)?lái)LabVIEW多線程之間的數(shù)據(jù)傳遞相關(guān)的分享,敬請(qǐng)期待!

對(duì)LabVIEW編程及相關(guān)知識(shí)感興趣的工程師們,歡迎持續(xù)關(guān)注、留言和點(diǎn)贊,也可以私信小編各位的技術(shù)困惑和技術(shù)需求,以獲取參加免費(fèi)線下培訓(xùn)和技術(shù)交流的機(jī)會(huì)哦。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • LabVIEW
    +關(guān)注
  • Vi
    Vi
    +關(guān)注

    關(guān)注

    3

    文章

    78

    瀏覽量

    21006
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3743

    瀏覽量

    80661
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    276

    瀏覽量

    19878
  • 線程編程
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6123
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    LabVIEW多線程編程數(shù)據(jù)傳遞教程

    很多時(shí)候在一個(gè)VI的不同線程或者不同VI的不同線程中需要有一些交互——這些線程并不能完全獨(dú)立運(yùn)行,需要一定的數(shù)據(jù)通信才能正確執(zhí)行,這時(shí)就需要
    的頭像 發(fā)表于 11-24 10:05 ?5550次閱讀
    <b class='flag-5'>LabVIEW</b><b class='flag-5'>多線程</b><b class='flag-5'>編程</b>數(shù)據(jù)傳遞教程

    LabView多線程語(yǔ)言

    Thread),用于處理界面刷新,用戶的操作;還有一個(gè)執(zhí)行線程,后臺(tái)工作。2。LabVIEW 是自動(dòng)多線程編程語(yǔ)言,只要
    發(fā)表于 06-08 10:13

    LABVIEW深入探索之性能與內(nèi)存管理

    性能了解VI的執(zhí)行特性LABVIEW執(zhí)行系統(tǒng)執(zhí)行系統(tǒng)是LABVIEW重要的組成部分,負(fù)責(zé)實(shí)際運(yùn)行我們的代碼。啟動(dòng)自動(dòng)并行機(jī)制對(duì)于LABVIEW
    發(fā)表于 09-28 17:32

    每日一教labview視頻教程【1.10】labview多核并行運(yùn)行編程

    隨著多核成為處理器的發(fā)展主流,對(duì)于并行編程多線程編程)也成為了開(kāi)發(fā)人員最大的難題,而LabVIEW憑借自身的
    發(fā)表于 01-10 13:48

    labview多線程編程

    子曰:何為labview多線程編程?
    發(fā)表于 03-11 15:46

    this vi初始化優(yōu)先級(jí)

    各位好:小弟初學(xué)labview,使用this vi初始化的時(shí)候,先后順序不統(tǒng)一呀,能設(shè)置優(yōu)先級(jí)嗎?經(jīng)常出現(xiàn)for循環(huán)完了才初始化各組件。。。
    發(fā)表于 01-20 20:30

    labview多線程技術(shù)

    labview開(kāi)發(fā)多線程技術(shù)難道是在同一個(gè)框圖中多用幾個(gè)WHILE循環(huán)結(jié)構(gòu)嗎?請(qǐng)玩過(guò)的大神指教
    發(fā)表于 07-25 10:33

    NI LabVIEW的多核編程技術(shù)指南

    并行硬件技術(shù)概覽:多處理器、超線程、雙核、多核與FPGA 1-2多線程與多任務(wù)的區(qū)別 3-5借助LabVIEW應(yīng)對(duì)多核編程的挑戰(zhàn) 6-9升
    發(fā)表于 07-01 10:43 ?0次下載

    LabVIEW是自動(dòng)多線程語(yǔ)言

      一般情況下,運(yùn)行一個(gè) VI,LabVIEW 至少會(huì)在兩個(gè)線程內(nèi)運(yùn)行它:一個(gè)界面線程(UI Thread),用于處理界面刷新,用戶對(duì)控件的操作等等;還有一個(gè)執(zhí)行
    發(fā)表于 03-27 17:25 ?5248次閱讀

    什么是多線程編程?多線程編程基礎(chǔ)知識(shí)

    摘要:多線程編程是現(xiàn)代軟件技術(shù)中很重要的一個(gè)環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進(jìn)程。本文主要以多線程編程以及
    發(fā)表于 12-08 16:30 ?1.2w次閱讀

    鴻蒙內(nèi)核源碼:32級(jí)優(yōu)先級(jí)的進(jìn)程和線程調(diào)度

    先看四個(gè)宏定義,進(jìn)程和線程線程就是任務(wù))最高和最低優(yōu)先級(jí)定義,[0,31]區(qū)間,即32級(jí)優(yōu)先級(jí)用于調(diào)度,CPU根據(jù)這個(gè)來(lái)決定先運(yùn)行哪個(gè)進(jìn)
    的頭像 發(fā)表于 04-24 11:18 ?1922次閱讀

    uC/OS-II學(xué)習(xí)筆記——優(yōu)先級(jí)反轉(zhuǎn)與優(yōu)先級(jí)繼承機(jī)制

    優(yōu)先級(jí)反轉(zhuǎn),是指某同步資源被較低優(yōu)先級(jí)的進(jìn)程/線程所擁有,較高優(yōu)先級(jí)的進(jìn)程/線程競(jìng)爭(zhēng)該同步資源未獲得該資源,而使得較高
    發(fā)表于 02-09 10:33 ?2次下載
    uC/OS-II學(xué)習(xí)筆記——<b class='flag-5'>優(yōu)先級(jí)</b>反轉(zhuǎn)與<b class='flag-5'>優(yōu)先級(jí)</b>繼承機(jī)制

    labview AMC多線程

    labview_AMC多線程
    發(fā)表于 08-21 10:31 ?27次下載

    淺談LabVIEW線程編程相關(guān)知識(shí)

    LabVIEW中只要程序框圖中的代碼可以并行運(yùn)行(功能模塊之間沒(méi)有連線關(guān)系,比如兩個(gè)獨(dú)立的While循環(huán)),那么LabIVEW在運(yùn)行這段代碼時(shí)就會(huì)自動(dòng)將它們分配在多個(gè)線程內(nèi)同時(shí)運(yùn)行。
    發(fā)表于 11-10 10:21 ?1150次閱讀
    淺談<b class='flag-5'>LabVIEW</b>的<b class='flag-5'>線程</b><b class='flag-5'>編程</b>的<b class='flag-5'>相關(guān)</b><b class='flag-5'>知識(shí)</b>

    LabVIEW SMO 的原理、用法和實(shí)際應(yīng)用

    LabVIEW SMO (Shared Memory Option) 是一種在 LabVIEW 中用于多線程編程和數(shù)據(jù)共享的選項(xiàng)。它允許多個(gè)并發(fā)的
    的頭像 發(fā)表于 12-27 16:47 ?1971次閱讀