[LabVIEW随笔-8] -Actor Framework框架学习2

1.Actor Framework演变

  1.1 将之前的MHL进行修改,首先将错误处理修改为单独的子VI,并重命名MHL类为Actor类

  image       image

 

 

   1.2 将Actor类的私有数据变为两个队列引用,在Actor.vi当中"创建队列引用"输出的队列引用绑定至私有数据的"自己的消息队列"

    image

   1.3 将循环体创建子VI,命名为Actor Core.vi

        image

   1.4 将该Actor.vi修改为"可重入"

2、LabVIEW异步调用  

    若通过子VI节点或通过引用调用节点以标准方式调用一个VI,数据流在被调用节点处暂停直到子VI返回结果。然后数据流从节点的输出端继续。

  异步调用VI时,子VI运行的同时数据流仍然在调用方中继续。如调用方VI不是立即需要子VI的执行结果,就可考虑异步调用子VI

  2.1 异步调用实现步骤:

    2.1.1 准备异步调用的VI引用

        使用打开VI引用函数获取VI引用,并通过异步选项标识(0x80, 0x100)作为选项输入的一部分。该步骤是让LabVIEW为异步调用分配资源

        “打开VI引用”函数的“类型说明符VI引用句柄”端口,传入的必须是严格类型的VI引用;

         “打开VI引用”函数的“选项”端口,需要传入“0x80”选项标签,表明将要开始的是异步调用;

        0x80:异步调用不收集结果,开始异步调用节点的目标是开始一个VI调用,但是不等待被调VI执行结束,自然也无法访问其输出

        0x100:异步调用收集结果,即等待异步调用结束,然后返回结果。使用“0x100”选项标签时,需要同时使用到如下两个函数(开始异步调用,等待异步调用)

        0x40:如需要多次使用“开始异步调用”节点调用可重入子VI的多个副本,并行运行,则可以设置此标签。注意:0x40选项标签调用的子VI 必须是可重入的,且共享同一个副本。

    2.1.2 开始异步调用

        将VI引用连接至开始异步调用节点,开始调用子VI。当子VI运行时,数据流继续在调用方VI中执行

    2.1.3 获取异步VI调用的结果  

        如应用程序需要异步调用的子VI的输出结果,将VI引用连接至等待异步调用节点以收集结果。等待异步调用节点等待相关子VI执行完毕直到超时。

    开始异步调用节点将输入参数传递至目标VI

    等待异步调用节点访问目标VI的输出,一个负责输入,一个负责输出;

    2.1.4 关闭VI引用

        使用关闭引用函数告知LabVIEW使用VI引用已完毕。LabVIEW将释放相关资源。

  2.2 异步调用Actor.vi

                  image

 

  目前Actor.vi内部的队列引用没办法使用,故需要处理一下

  2.2.1 创建数据类型为"队列引用"的队列,并将其嵌套队列引用作为Actor.vi的输入

image

 

                                   图1 Message类队列引用入到嵌套队列当中

           

                  image

                                 图2 创建数据类型为队列的队列,并将其作为Actor.vi输入

  为使其得到服用,可以将Actor类作为父类输入参数,后续可使用其子类作为输入参数可动态调用VI

  

        image

 

   2.2.3 测试操作者

      发送停止消息:

                image

     创建Actor子类,并重写Actor Core:

    image        image      

 

      重写Actor Core.vi

              image

 

 

                  image

 

     2.4 小结

    创建Actor逻辑步骤:

    1、创建数据类型为"队列引用"嵌套队列

    2、创建数据类型为"Message类"的队列引用,并将其作为数据入嵌套队列当中

    3、同时将"Message类"的队列引用绑定至"Actor类.自己的调用队列"当中

    4、根据不同的Actor对象选择不同的Actor Core方法

    5、Actor Core将"Actor对象.自己的消息队列"出队列(若没有消息则不会出队列)

    6、根据不同"Message"对象执行不同Do方法

posted @ 2025-12-03 23:29  nonAny  阅读(5)  评论(0)    收藏  举报