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

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

3天内不再提示

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

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

很多时候在一个VI的不同线程或者不同VI的不同线程中需要有一些交互——这些线程并不能完全独立运行,需要一定的数据通信才能正确执行,这时就需要在编程时使用LabVIEW提供的数据通信与同步的一些机制,使需要传递的数据可以在多个线程之间流通,这样才能使程序按照正确的预期来执行。

本篇文章小编会跟大家讲解一些常用的数据通信与同步的方法,欢迎大家来一起交流讨论!

本文教程

LabVIEW多线程编程数据传递

首先我们要知道用户一般是想在两个并行的循环中传递数据,而不是串行执行的循环,那么什么样的循环是串行执行的,什么样的循环是并行执行的呢?

串行执行循环:

循环之间有隧道连线,并且由于这个数据线的串联导致LabVIEW数据流执行两个循环时串联执行,只有当前面的循环执行结束后,后面的循环才会开始执行,这就是串行执行的循环。

wKgZomVgBbWAYVIqAAAjBaYdz1s602.jpg

并行执行循环:

循环之间可以同时独立运行,循环之间不存在影响LabVIEW数据流并行执行两个循环的隧道连线。

wKgZomVgBbWAPAOJAAApBmDANhA263.jpg

图中的两个循环采取了可以打破数据流的“局部变量”来进行数据的通信,这种方式可能会带来竞争的危险,所以一般不推荐大家作为多线程中传递数据的首选方法。接下来小编给大家列举一些多线程之间数据通信常用的方法。

一、队列:

一般来说,当需要在不同线程之间进行通讯或同步的时候首先要考虑的方法绝对是队列,因为队列操作简单高效,队列传递的是地址而不是值,在大量数据传输时有很高的效率且不会占用过多内存开销。

在掌握了队列操作的API之后就可以非常快速地搭建一个多线程之间的数据传输架构,最基础的多线程软件设计模式—生产者消费者模式就是使用队列搭建的,事实上一些耳熟能详的软件架构比如QMH架构、JKI状态机、AF架构等,它们在多线程中传递数据的模块查找到最底层也都是使用队列封装出来的。

下图是LabVIEW自带的设计模板,它就是使用队列搭建的一个简单的生产者消费者架构,使用队列来在两个线程之间传递数据。

wKgZomVgBbWANVkUAACzcRDYRPo406.jpg

二、通道连线:

从LabVIEW 2016开始新增了可以在并行代码段之间异步传递数据的“数据线”,也称为“通道连线”。LabVIEW提供了多种通道模板(串流、Tag、消息器等),每种模板表示不同的通信协议,可以根据应用程序的通信需求选择模板。

串流只支持单输入单输出,它是缓冲先进先出数据的一对一消息传输(类似于单条队列),Tag虽然可以支持多个写入和读取,但是多个写入方之间会产生竞争,读取方只能读取到最新写入的那个数据,它是单个值数据的N对M消息传输(类似于一个缓冲区大小为1的有损耗队列)。消息器可以支持多个写入方和读取方,它是按先进先出顺序的缓冲命令类消息的N对M消息传输(类似于多条队列并行)。

如需创建通道线,首先应创建写入方端点:右键单击接线端或类型,选择创建»通道写入方。从写入方端点的通道接线端绘制通道线并创建读取方端点:右键单击通道线,选择创建»通道读取方

wKgaomVgBbWACJBDAABgUXRo12o804.jpg

通道线在代码段之间传输数据的方式与引用句柄或变量相同。但通道线所需的节点数少于引用句柄或变量,并且使用可见的连线直观表示数据传输。

wKgaomVgBbWAKu5VAAASvICiM0E203.jpg

上图是一个使用通道连线的范例,可以在两个并行循环中传递数值数据,除了数值类型以外,通道连线还可以接受LabVIEW中存在的任何数据类型,例如字符串、枚举、路径、波形、布尔值、簇、数组、对象等。

wKgaomVgBbWAFsYjAACEXquCVs0358.jpg

注意事项:

1、不要组合使用常规连线和通道连线连接循环;

wKgaomVgBbWAT1--AABfSt5Epy8041.jpg

2、通道不是数据,不可以放入数据容器中;

wKgZomVgBbWAY-xUAABkonz48lU038.jpg

3、通过在写入端点上设置缓冲区大小来限制缓冲区;

4、使用串流通道时,消费者循环的速度必须高于生产者循环,如果生产者循环比消费者循环运行更快,会占用大量内存(未设置缓冲区大小时);

三、功能性全局变量:

相信大家对LabVIEW中的局部变量和全局变量都有一定的了解,它们分别可以在单个VI中或者单个应用程序的所有VI中传递数据。它们使用十分方便,导致很多用户对它们使用十分频繁,可是一旦使用不当,就会产生竞争,进而导致数据错误传递,产生未预期的结果,这种错误很难排查。而使用功能性全局变量可以更加安全地在多个线程之间传递数据。

功能性全局变量其实是一个VI,它既可以实现全局变量的功能又可以避免竞争,所以在某些传递数据的需求中可以用它来代替全局变量使用。一个功能性全局变量必须具备:1、只循环一次的循环;2、未初始化的移位寄存器;3、指定动作输入参数的枚举;4、设置为“非重入VI”。

wKgaomVgBbWAKCgKAAAvEsN0-7Y507.jpg

如上图所示,这是一个很简单的功能性全局变量,它可以用来在不同调用方中传递一个双精度浮点数据。只循环一次的循环可以让这个功能性全局变量每次被调用只执行一次对应动作,未初始化的移位寄存器可以使全局变量中始终保存上次动作结束后的值而不被初始化掉;指定动作输入参数的枚举可以指定不同调用方执行数据的读取或写入。通常功能性全局变量都会设置为非重入执行,这样可以保证它被调用时始终按照被调用的顺序来执行,从而避免引起竞争。

四、用户事件:

用户事件属于动态事件的一种,它可以在不同的VI中传递一些自定义的数据,所以我们在多线程编程中可以使用它在不同线程中传递数据。小编之前写过一篇给关于动态事件的文章,对这种方法感兴趣的小伙伴可以参考下面的链接学习如何利用用户事件传递数据:

总结:

除了文章中介绍的这四种数据传递方法之外,LabVIEW其实还有很多其他多线程之间的同步机制,比如网络流、通知器、共享变量、信号量等,由于篇幅所限,在这就不过多赘述了,感兴趣的小伙伴欢迎留言讨论!

以上就是有关LabVIEW多线程编程第二章节的所有内容啦,系列文章浅谈LabVIEW多线程编程的内容分享结束,欢迎大家一起交流探讨!

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

    关注

    1918

    文章

    3619

    浏览量

    316991
  • 编程
    +关注

    关注

    88

    文章

    3440

    浏览量

    92388
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724

原文标题:知识分享 | 浅谈LabVIEW多线程编程(二)

文章出处:【微信号:华穗科技,微信公众号:华穗科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LabView多线程语言

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

    求解Labview多线程编程问题

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

    labview2011自动多线程实例

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

    labview多线程编程

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

    labview多线程技术

    labview多线程技术
    发表于 01-10 16:00

    QNX环境下多线程编程

    介绍了QNX 实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法。QNX 是由加拿大
    发表于 08-12 17:37 30次下载

    linux多线程编程课件

    电子发烧友为您提供了linux多线程编程课件,希望对您学习 linux 有所帮助。部分内容如下: *1、多线程模型在单处理器模型和多处理器系统上,都能改善响应时间和吞吐量。 *2、线程
    发表于 07-10 11:58 0次下载

    linux多线程编程开发

    本文中我们针对 Linux 上多线程编程的主要特性总结出 5 条经验,用以改善 Linux 多线程编程的习惯和避免其中的开发陷阱。在本文中,我们穿插一些 Windows 的
    发表于 12-26 14:24 55次下载
    linux<b class='flag-5'>多线程</b><b class='flag-5'>编程</b>开发

    MFC下的多线程编程

    计算机上的上位机制作工具语言之MFC下的多线程编程
    发表于 09-01 14:55 0次下载

    Windows多线程编程

    计算机上的上位机制作工具语言之Windows多线程编程,感兴趣的可以看看。
    发表于 09-01 15:27 0次下载

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

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

    Linux下的多线程编程

    上,这个数据可能会有较大的区别。        使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据
    发表于 04-02 14:43 474次阅读

    labview AMC多线程

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

    多线程如何保证数据的同步

    多线程编程是一种并发编程的方法,意味着程序中同时运行多个线程,每个线程可独立执行不同的任务,共享同一份
    的头像 发表于 11-17 14:22 349次阅读

    mfc多线程编程实例

    (图形用户界面)应用程序的开发。在这篇文章中,我们将重点介绍MFC中的多线程编程多线程编程在软件开发中非常重要,它可以实现程序的并发执行,提高程序的效率和响应速度。MFC提供了丰富
    的头像 发表于 12-01 14:29 504次阅读