Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays LabVIEW:如何在循环之间交换大量变量?_Arrays_Loops_Labview - Fatal编程技术网

Arrays LabVIEW:如何在循环之间交换大量变量?

Arrays LabVIEW:如何在循环之间交换大量变量?,arrays,loops,labview,Arrays,Loops,Labview,我有两个循环: 一个循环从设备获取数据并对其进行处理。缩放接收的变量,计算额外数据 第二个循环将数据可视化并存储 有很多不同的变量需要在这两个循环之间传递——大约50个变量。我需要第二个循环只访问数据的最新值。它需要能够在需要可视化的任何时候读取这些变量 在两个循环之间共享向量的最佳方式是什么?共享数据的方式多种多样。 最快和最简单的是局部变量,但它是不受控制的,您需要确保将它们写入一个位置(另外还需要一个指示符)。 最高级的选项之一是为您的数据创建一个类,并使用实例(如果您创建一个by-ref

我有两个循环:

  • 一个循环从设备获取数据并对其进行处理。缩放接收的变量,计算额外数据
  • 第二个循环将数据可视化并存储
  • 有很多不同的变量需要在这两个循环之间传递——大约50个变量。我需要第二个循环只访问数据的最新值。它需要能够在需要可视化的任何时候读取这些变量


    在两个循环之间共享向量的最佳方式是什么?

    共享数据的方式多种多样。 最快和最简单的是局部变量,但它是不受控制的,您需要确保将它们写入一个位置(另外还需要一个指示符)。
    最高级的选项之一是为您的数据创建一个类,并使用实例(如果您创建一个by-ref类,否则就不重要了),然后创建一个公共的“GET”方法

    在这两者之间,您还有其他几种选择:

    • 排队
    • 信号量
    • 属性节点
    • 全局变量
    • 共享变量
    • 通知者
    • 事件
    • TCP-IP

    简言之,没有最好的方法,这完全取决于您的技能和应用。

    共享数据的方式多种多样。 最快和最简单的是局部变量,但它是不受控制的,您需要确保将它们写入一个位置(另外还需要一个指示符)。
    最高级的选项之一是为您的数据创建一个类,并使用实例(如果您创建一个by-ref类,否则就不重要了),然后创建一个公共的“GET”方法

    在这两者之间,您还有其他几种选择:

    • 排队
    • 信号量
    • 属性节点
    • 全局变量
    • 共享变量
    • 通知者
    • 事件
    • TCP-IP

    简而言之,没有最好的方法,这完全取决于你的技能和应用。

    快速而肮脏的方法是将每个值写入生产者循环中的一个指示器-这些指示器可以隐藏在屏幕外,或者在选项卡控件的一页中,如果你不想看到它们-并读取消费者循环中每个指示器的局部变量。但是,如果您有50个不同的值,那么如果需要更改或扩展此代码,则可能很难维护此代码

    正如Ton所说,有许多不同的选择,但我的建议是:

    • 创建包含所有数据的具有命名元素的群集控件
    • 将此群集另存为typedef
    • 使用此群集作为数据类型创建通知程序
    • 将数据捆绑到集群中(按名称),并将其写入生产者循环中的通知程序
    • 从消费者循环中的通知程序中读取集群,按名称将其拆分,并对每个元素执行所需操作

    使用集群意味着您可以轻松地将其传递给不同的subVIs以处理不同的元素(如果您愿意),而另存为typedef意味着您可以添加、重命名或更改元素,并且您的代码将更新以匹配。在使用者循环中,如果需要,可以使用通知程序读取的超时设置来控制循环计时。您还可以使用通知程序告诉循环何时退出,方法是强制销毁它并捕获错误。

    快速而肮脏的方法是将每个值写入生产者循环中的一个指示器-这些指示器可以隐藏在屏幕外或选项卡控件的一页中,如果您不想看到它们,请读取使用者循环中每一个的局部变量。但是,如果您有50个不同的值,那么如果需要更改或扩展此代码,则可能很难维护此代码

    正如Ton所说,有许多不同的选择,但我的建议是:

    • 创建包含所有数据的具有命名元素的群集控件
    • 将此群集另存为typedef
    • 使用此群集作为数据类型创建通知程序
    • 将数据捆绑到集群中(按名称),并将其写入生产者循环中的通知程序
    • 从消费者循环中的通知程序中读取集群,按名称将其拆分,并对每个元素执行所需操作
    使用集群意味着您可以轻松地将其传递给不同的subVIs以处理不同的元素(如果您愿意),而另存为typedef意味着您可以添加、重命名或更改元素,并且您的代码将更新以匹配。在使用者循环中,如果需要,可以使用通知程序读取的超时设置来控制循环计时。您还可以使用通知程序强制销毁循环并捕获错误,告知循环何时退出。

    两种方法:

  • 使用带有SEQ(单元素队列)的显示循环
  • 将事件结构与用户事件一起使用。(不要将两个事件结构放在同一个循环中!!使用另一个)
  • 使用具有大小写结构和变量的枚举将数据强制转换为预期类型

    (通知程序无法可靠地流式传输数据,因为它是一个有损的方案。只允许触发小动作)

    两种方式:

  • 使用带有SEQ(单元素队列)的显示循环
  • 将事件结构与用户事件一起使用。(不要将两个事件结构放在同一个循环中!!使用另一个)
  • 使用具有大小写结构和变量的枚举将数据强制转换为预期类型


    (Notifier无法可靠地流式传输数据,因为它是一个有损的方案。只允许触发小动作)

    如果循环位于同一VI内,则:

    最简单的解决方案是局部变量。
    使用共享变量要好一点。
    更好的方法是使用函数全局变量(FGV)
    最好的解决方案是使用SEQ(单元素队列)


    无论如何,为了更好地理解,请仔细阅读。

    如果回路位于同一VI内,则:

    最简单的解决方案是局部变量。
    使用共享v更好一点
    queues (OK, has most features)
    notifiers (OK)
    events (OK)
    FGVs (OK, but keep an eye on massively parallel access hindering exec)
    
    semaphores (that's not data comms)
    property nodes (very inefficient, prone to race cond.)
    global variables (prone to race cond.)
    shared variables (badly implemented by NI, prone to race cond.)
    TCP-IP (slow, awkward, affected by firewall config)