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

1、QMH设计模式

  1.1 QMH设计模式时生产者/消费者和事件处理体系的组合,其包含两个循环:事件处理循环(EHL)和消息处理循环(MHL),MHL接收并处理消息、触发UI事件时,消息排队

  1.2 EHL:与前面板控件的交互对用户触发的事件做出反应,通过用户事件,事件可能来自其他源(如MHL),触发或生成事件时,将执行与该事件的事件结构,然后创建相应的消息并排队发送值MHL当中

  1.3 MHL:对传入的消息执行

  1.4 消息的组成:消息名称、数据

  

  1.5 生产者消费者模型 

image

 

  上面循环的为生产者,下面的为消费者。主要是使用队列进行操作

 

  1.6 添加用户事件后   

    1、创建用户事件
    2、注册用户事件
    3、生成用户事件
    4、处理用户事件
    5、取消用户事件
    6、销毁用户事件

image

 

  1.7 停止条件

  目前有两个后续可能有多个并行循环正在运行,若其中一个停止运行,而另外一个没有停止,程序将会无响应,故任何循环的停止都该确保其他条件被停止

  1.7.1 EHL停止:需要发送消息以命令MHL停止

  1.7.2 MHL停止:发送"停止"对应的用户事件至EHL以停止,若还有其余MHL,让EHL发送消息让他们一起停止(当前未编写,在MHL产生用户事件即可)

image

 

2、使用面向对象改造MHL

   2.1 改造前MHL:

      image

   使用面向对象改造MHL:

  2.2 将数据信息(VISA、电压、采集?组成的簇封装为类成员字段)  

    image

 

  2.3 将采集电压及其输入信息封装为静态方法:

    image                          image

 

 

  2.4 将数据对象替换簇

image

 

 2.5 创建抽象Message类并创建虚函数(动态分配VI)

image

 2.6 使用Messgae抽象类替换入队消息簇后的结果:

image

 2.7 创建采集电压类,继承自Message类,为携带数据内部添加一个布尔控件,并添加访问器,并将其入队(仅为演示,实际应当在EHL或其余MHL进行入队)

image

imageimage

 

image

 

 2.8 "采集电压"类重载方法Do.vi

image

 

3、使用改造后的QHM

  3.1 将发送消息(入队操作)封装为一个子VI 

    image

   

  3.2 MHL为使用用户事件句柄,需要在MHL私有数据添加一个"用户事件句柄"类型数据,并添加数据访问器

    image

   3.3 在"采集电压"当中产生用户事件 

    image

 

  3.4 添加用户事件处理与发送开始消息

image                           image

 

   3.5 目前无法停止下方MHL循环,故需要创建停止消息类(继承自消息类)

              image

   3.6 "程序停止类"重写Do.vi与"发送停止消息"

        image                              image

  3.7 改造后的QHM

 

image

 

 

  3.8 为防止MHL异常退出,EHL没有退出,引入"停止"用户事件,重写Do方法,发送停止消息

      image                 

image

 

posted @ 2025-12-03 10:47  nonAny  阅读(12)  评论(0)    收藏  举报