0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LabVIEW多线程编程解析 LabVIEW的VI优先级和并行循环等相关知识

华穗科技 来源:华穗科技 作者:华穗科技 2023-11-10 10:20 次阅读

软件开发过程中总会遇到需要多线程同步运行的情况,尤其是一些复杂的测试系统和大型项目,仅靠单线程运行的程序是远远无法满足用户需求的,甚至可以说在复杂测试系统的软件开发中,多线程运行是最基本的。

所以不论使用什么开发环境都需要工程师们掌握如何进行多线程编程。在多线程开发这一点上LabVIEW有其独到的优势,那就是LabVIEW是自动并行运行的语言,它可以自动多线程运行。

下面就小编就和大家浅谈一下LabVIEW的线程编程的相关知识吧!

本文教程

LabVIEW多线程编程基础概念

一、单线程与多线程:

LabVIEW在5.0开始才支持多线程,在此之前,LabVIEW其实是单线程运行的。在了解LabVIEW多线程之前,我们需要了解单线程的含义:单线程并不是指代码固定在某个线程上一直执行,系统有可能也会将它切换到其他线程上去运行,但是在同一时刻它只会存在于单个线程中,不会有多个线程去同时运行这段代码。而多线程指的是在同一时刻系统可能会在多个线程中同时运行代码。

在LabVIEW中只要程序框图中的代码可以并行运行(功能模块之间没有连线关系,比如两个独立的While循环),那么LabIVEW在运行这段代码时就会自动将它们分配在多个线程内同时运行。

一般情况下,LabVIEW运行VI时至少会开辟两个线程,一个是负责刷新界面、响应用户操作控件等界面操作功能的用户界面线程;另外一个或多个线程是负责执行除界面操作以外的其他工作,称之为执行线程。

二、LabVIEW的多线程:

如下图所示,这是两个独立运行的While循环,这段代码在执行时会被LabVIEW自动分配到两个线程中去执行。

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

通过上面这个示例就可以看到,在LabIVEW中编写多线程程序十分简便。由于两个循环中没有延时函数,程序会十分快速地执行,所以对系统来说它们是两个较为繁重的线程,一般对于这种任务繁重的线程,多核CPU计算机还会将它们额外安排到不同的CPU内核上去运行。如下图所示,运行上述示例以后系统自动将它们分配到不同的内核中去运行,这样可以合理利用CPU资源,提高程序运行速度,节省程序执行时间,防止某个CPU内核被100%占用导致卡死。

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

三、LabVIEW的执行系统:

LabVIEW自己有一套调度系统,负责代码的调度和运行,这就是LabVIEW的执行系统。LabVIEW目前有六个执行系统,分别是:用户界面、标准、仪器I/O、数据采集以及其他1、其他2执行系统。一个应用程序中的众多子VI是可以分别放在不同的执行系统里运行的,用户可以在VI属性中指定VI的执行系统。

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

在LabVIEW支持多线程后,不同执行系统中的代码就被划分在了不同的线程下运行。其中用户界面执行系统只有一个线程,那就是一开始提到的用户界面线程;其他执行系统可以为代码开辟多个线程。

四、LabVIEW的VI优先级:

用户可以在VI属性中指定VI的优先级属性。LabVIEW VI优先级有后台、标准、高于标准、高、实时这六个档次。其中前五项是从低到高的优先级顺序,优先级越高越容易抢占到CPU资源。而子程序这一项比较特殊,当一个VI的优先级被设置为子程序时,VI前面板、调试信息会被移除(不能用作界面、不能调试),同时在执行该VI时应用程序会短暂变为单线程执行,即在这个VI执行结束之前,不会被别的线程打断;这意味着子程序的VI在执行时会得到最多的CPU资源,所以某些纯算法的VI,假如不是特别耗时就可以设置为子程序的优先级。

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

在设置VI优先级时需要注意:1、在一个应用程序中,提高一个VI的优先级并不能缩短应用程序整体占用CPU的时间,只是意味着这个VI会比其他VI更多、更容易抢占到CPU资源,所有VI占用CPU的整体时间是不会变的;2、低优先级相对于高优先级的VI,并不是高优先级的VI会一定先执行,只是说明高优先级VI有更高的概率抢占到CPU资源;

在单核CPU的计算机上,LabVIEW最多为每个执行系统下的每个档次优先级开启四条线程,如果是多核CPU,每增加一个CPU内核,可开辟的线程数目翻倍。实际上一个程序在运行时并不会有那么多优先级和执行系统设置,所以并不会开辟很多线程。

小编这里提醒大家编程时线程不是越多越好,因为线程的开辟、销毁、切换等都是需要消耗资源的,如果线程开的太多,切换线程太频繁,反而会导致程序执行的效率降低。

五、定时结构:

对于多核CPU的计算机,有时候操作系统自动分配线程至CPU内核的策略可能并不是最优解,于是就需要我们人工去指定,即某个线程应该被指定到计算机的哪个CPU内核上执行。现在绝大部分计算机的CPU性能都足够强大,所以一般情况下,只有对于执行效率要求极其苛刻的程序才会需要我们人工去指定CPU内核的分配方案。

需要人工指定CPU分配方案时,我们可以使用定时结构来替换程序中原有的结构,定时结构可以更加精确的执行某段程序代码,并且它还包含一些用于高精度定时、处理器分配等的辅助功能,定时结构包含定时循环结构和定时顺序结构,如下图所示:

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

可以看到相对于普通的循环或者顺序结构,定时结构左侧有一些输入端,可以进行一些配置,这些配置可以在程序运行过程中使用输入接线端进行动态设置,也可以在配置面板中静态进行设置,如下图所示:

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

在该配置面板中,处理器分配模式就是用来指定CPU的设置,可以将它选择为手动模式,然后在后面选择要分配的CPU内核名称即可。在实际应用中,我们可以将按照执行任务的耗时来划分,将耗时比较多的任务单独指定在一个CPU中,不同CPU中平衡分配任务,提升程序整体运行的速度。

六、并行循环

前面提到当两个循环并行运行,它们之间没有数据连线时LabVIEW会将它们划分到两个不同的线程中去执行。那么当只有一个循环时,一般情况下,LabVIEW只会为此循环开辟一个线程来执行,但是如果这个循环中的代码本身就比较耗时,那么这段代码的执行效率就会十分低,如下图所示:

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

上述示例中的这段代码执行一次需要859ms,属于相当耗时的代码了,它每次循环都需要经过大量数学运算,对于这种循环,可以将它配置成并行运行模式,在循环上右键并选择“配置循环并行”

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

选择之后就会看到一个配置窗口:

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

首先我们需要先勾选“启用循环迭代并行”,然后配置生成的并行循环实例数量,一般来说实例数最高设置成计算机的内核总数量,设置数量超过计算机的内核数量就没有意义了,不会再继续提高程序的运行速度。

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

上图是将原先的示例改为并行循环并设置了8个线程之后的执行情况,可以看到它的运行时间显著减少,程序的执行效率得到了很大的提升。

注意事项:

1、配置并行循环要求循环内部的代码不能依赖之前循环运算的结果(比如不能使用反馈节点和移位寄存器),因为如果程序依赖之前循环运算的结果就表明这个程序不能并行运行,必须强制迭代按顺序执行,如果强行配置为并行循环会导致VI报错无法运行。

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

2、配置为并行循环的程序无法在循环内部使用探针等调试手段,如果需要调试可以勾选配置循环并行面板中的“允许调试”,勾选之后它会强制所有并行的线程按照顺序迭代,这样会使并行运行的执行效率降低到之前的单线程运行的水平,所以一般代码调试完成后一定要记得取消此勾选项。

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

七、内容总结

1、明确LabVIEW单线程和多线程的概念;

2、了解LabVIEW自动多线程的相关知识;

3、熟悉LabVIEW执行系统的相关知识;

4、掌握LabVIEW VI优先级设置及其注意事项;

5、学习定时结构和并行循环的使用及注意事项;

以上就是有关LabVIEW多线程编程第一章节的所有内容啦,欢迎大家一起交流探讨!下一章小编将会为大家带来LabVIEW多线程之间的数据传递相关的分享,敬请期待!

对LabVIEW编程及相关知识感兴趣的工程师们,欢迎持续关注、留言和点赞,也可以私信小编各位的技术困惑和技术需求,以获取参加免费线下培训和技术交流的机会哦。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • LabVIEW
    +关注

    关注

    1918

    文章

    3619

    浏览量

    317004
  • Vi
    Vi
    +关注

    关注

    3

    文章

    78

    浏览量

    20944
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79549
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19725
  • 线程编程
    +关注

    关注

    0

    文章

    5

    浏览量

    6105
收藏 人收藏

    评论

    相关推荐

    LabVIEW多线程编程数据传递教程

    很多时候在一个VI的不同线程或者不同VI的不同线程中需要有一些交互——这些线程并不能完全独立运行,需要一定的数据通信才能正确执行,这时就需要
    的头像 发表于 11-24 10:05 2336次阅读
    <b class='flag-5'>LabVIEW</b><b class='flag-5'>多线程</b><b class='flag-5'>编程</b>数据传递教程

    LabView多线程语言

    Thread),用于处理界面刷新,用户的操作;还有一个执行线程,后台工作。2。LabVIEW 是自动多线程编程语言,只要
    发表于 06-08 10:13

    LABVIEW深入探索之性能与内存管理

    性能了解VI的执行特性LABVIEW执行系统执行系统是LABVIEW重要的组成部分,负责实际运行我们的代码。启动自动并行机制对于LABVIEW
    发表于 09-28 17:32

    每日一教labview视频教程【1.10】labview多核并行运行编程

    随着多核成为处理器的发展主流,对于并行编程多线程编程)也成为了开发人员最大的难题,而LabVIEW凭借自身的
    发表于 01-10 13:48

    求解Labview多线程编程问题

    labview中同时写入两个并行程序框图可以并行运行但是相互之间有影响,比如说图像采集和读取数据,读取数据快了,图像采集就慢了。 在成宿框图中加延时可以解决这样的问题。效果不是很明显请教各位大神有没有更好的方法解决
    发表于 07-14 09:55

    labview2011自动多线程实例

    提供一个简单的实例,让大家体验到labview多线程编程的优点和labview实现自动多线程的强大功能。
    发表于 10-06 10:06

    labview多线程编程

    子曰:何为labview多线程编程
    发表于 03-11 15:46

    this vi初始化优先级

    各位好:小弟初学labview,使用this vi初始化的时候,先后顺序不统一呀,能设置优先级吗?经常出现for循环完了才初始化各组件。。。
    发表于 01-20 20:30

    labview多线程技术

    labview开发多线程技术难道是在同一个框图中多用几个WHILE循环结构吗?请玩过的大神指教
    发表于 07-25 10:33

    LabVIEW中为何要关闭多线程

    LabVIEW中为何要关闭多线程LabVIEW中,为何要关闭多线程?解答: 关于关闭多线程存在两个原因:正在使用旧的或者较慢的电脑所用
    发表于 05-08 21:10

    LabVIEW是自动多线程语言

      一般情况下,运行一个 VILabVIEW 至少会在两个线程内运行它:一个界面线程(UI Thread),用于处理界面刷新,用户对控件的操作等等;还有一个执行
    发表于 03-27 17:25 5194次阅读

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程以及
    发表于 12-08 16:30 1.2w次阅读

    LabViEW编程VI服务器综述

    LabViEW编程VI服务器综述
    发表于 09-09 10:14 20次下载

    labview AMC多线程

    labview_AMC多线程
    发表于 08-21 10:31 23次下载

    浅谈LabVIEW线程编程相关知识

    LabVIEW中只要程序框图中的代码可以并行运行(功能模块之间没有连线关系,比如两个独立的While循环),那么LabIVEW在运行这段代码时就会自动将它们分配在多个线程内同时运行。
    发表于 11-10 10:21 454次阅读
    浅谈<b class='flag-5'>LabVIEW</b>的<b class='flag-5'>线程</b><b class='flag-5'>编程</b>的<b class='flag-5'>相关</b><b class='flag-5'>知识</b>