【AMC】异步消息通信框架讲解(二)

1.队列消息处理程序设计模式

        队列消息处理器 (QMH) 设计模式是包含在 AMC 参考库中的 VI 模板。它位于 AMC 函数面板上,可以直接拖放到空白 VI 的图表上。QMH 是一种基本的生产者-消费者架构,可用作整个应用程序中各种 LabVIEW VI 的基础。QMH 设计模式的常见用途是应用程序的用户界面、对话框窗口、命令和通信解析器、基于状态的控制器等。

        QMH 设计模式的目的是接收、存储和处理消息。消息可以是来自用户界面的事件、从通信接口收到的命令等。一般来说,消息是需要某些动作、操作、服务或其他响应的异步事件。

        QMH 使用异步消息通信 (AMC) 库实现,该库存储来自一个或多个消息生成器或源的消息。消息处理器从 AMC 消息队列读取消息。消息处理器由多个案例或状态组成,每个案例或状态专用于处理来自队列的特定消息。

        消息队列可从多个消息生成器访问,这些消息生成器都将消息放在队列中以供消息处理器处理。然而,在特定实现(例如用户界面 VI)中通常只存在一个消息生成器。

        除了专用的消息生成器之外,消息处理器中的处理例程也可能在处理其他消息时将新消息放入消息队列。例如,处理一条消息时出错可能导致消息处理器将错误消息放入队列,随后由消息处理器中的另一个例程进行处理。

        在 QMH 的正常运行期间,消息通常放在队列的末尾,并按照先进先出 (FIFO) 的方式从队列的前面进行处理。 

        在某些情况下,希望尽快处理队列中的新消息。在这种情况下,可以使用 AMC 库中的优先级消息标志将消息放在队列的最前面,并在消息处理器下次从队列中检索消息时进行处理。

         队列消息处理器 (QMH) 设计模式是围绕 AMC 库和 LabVIEW 队列构建的,用于存储消息并使用基于 While 循环/Case 结构的消息处理器。为了简化 QMH 设计模式在新 VI 和应用程序中的使用,AMC 库包含一组模板和示例,可用作新 VI 和应用程序的起点。安装 AMC 参考库后,QMH 模板可在用户库函数面板的 AMC 子面板中使用。

消息定义

        开发队列消息处理程序时,有多种方法可以定义存储在队列中的消息。常见的实现包括字符串、变量和枚举。每种选择都有不同的优点和缺点。

        AMC 参考库使用字符串作为消息的基本数据类型,因为它能够轻松地将任何消息传递到队列,而无需在 VI 或应用程序中定义一组允许的消息。这简化了向应用程序添加新消息的过程,并简化了在各种应用程序中使用参考库的过程。但是,使用字符串作为消息名称数据类型确实更有可能在消息名称中产生拼写错误或将消息处理器未处理的消息添加到队列。指定消息时必须小心谨慎,并且应使用消息处理程序中的特殊错误情况来检测和报告任何未处理的消息。

        可以使用枚举来定义应用程序允许的特定消息集,而不是字符串。创建 TypeDef 枚举确实可以更轻松地更改应用程序中允许的消息集,同时防止在编程过程中选择消息时出现任何拼写错误。但是,使用枚举时,需要针对 AMC 库的每次使用调整允许的消息集,因此一组用于管理消息队列和消息的 VI 不能用于 QMH 设计模式的多个应用程序。 

创建消息队列并添加消息

        在将消息添加到队列之前,必须使用“创建消息队列”VI 创建消息。作为创建队列的一部分,您可以在队列上放置一些初始消息。这些消息将是消息处理器中处理的第一条消息。通常,这些消息用于 VI 的启动或初始化。        

        创建队列后,可以使用 AMC 发送本地消息 VI 将消息添加到队列中。

        在下图中,创建了队列,并将三条初始消息添加到队列中。在用户界面事件处理程序中,当操作员按下 UI 上的“保存状态”按钮时,“写入配置文件”消息将添加到队列中。此图中未显示消息处理器。

        您还可以使用“发送本地消息”VI 在单个操作中将多条消息添加到队列。多条消息将以字符串数组的形式传递到 VI。

        在某些情况下,除了存储在队列中的消息之外,能够随消息传递其他数据(例如值或属性)也很有用。这些附加数据用于消息处理器以自定义消息的处理。消息值作为字符串或字符串数​​组传递到发送本地消息。上图将时钟样式控件的新值作为设置时钟样式消息的参数。

处理消息

        从队列中,消息在消息处理器循环中读取,然后由消息处理器中使用的每条消息的单独案例进行处理。基本消息处理器包括“读取下一条消息”VI 和带有每条消息单独案例的案例结构。

从队列读取消息

        Read Next Message VI 包含一些在消息处理器中应注意的特定功能。此 VI 的默认操作是从队列返回下一条消息以及关联的值字符串和属性键控数组。消息名称用作消息处理器的案例结构选择器,值和属性可用于特定的消息处理器案例。

暂停        

        如果队列中没有消息可用,AMC 读取下一消息的超时值将决定 VI 何时返回。在这种情况下,VI 将返回一个空消息字符串,该字符串应在适当的情况下进行处理。QMH 设计模板中包含的消息处理程序模板包含一个标记为“”、“等待”的消息处理器案例,如果 AMC 读取下一消息 VI 超时,则会调用该案例。此消息处理器案例可用于处理 VI 操作中必要的后台任务,例如前面板更新等。也可以通过在队列上放置等待消息来调用此案例。

 

终止QMH

         必须处理终止 QMH,以便消息处理器和所有消息生成器(例如用户界面事件循环)都能正常关闭。在某些情况下,如果消息生成循环还处理 VI 中的其他操作,则它可能会继续运行。但是,在消息处理器关闭后,它不应再向队列添加任何消息。

        通常,QMH 将响应前面板的用户操作(例如退出按钮)或从应用程序另一部分收到的消息而终止。在消息生成器中,将一条消息添加到队列中,以指示消息处理器关闭。此外,可以通过将 True 传递给 While 循环条件停止终端来关闭消息生成器循环。

        当消息处理器收到关闭 QMH 的消息时,它应该在终止消息处理器循环之前在相应的消息案例中执行任何必要的操作。Read Next Message VI 旨在识别一个或多个用于终止 QMH 的消息,并将在 Exit Process 输出上返回 True 值,该值可用于终止消息处理器循环。关闭本地进程的默认消息是 Exit,但可以通过将所需的关闭消息名称传递给 Read Next Message VI 来更改它。

默认消息处理器

        由于使用字符串作为消息名称数据类型,因此在将消息添加到消息队列时可能会出错或输入错误。任何此类错误消息在消息处理器中都没有相应的消息案例。因此,应使用消息处理器的条件结构默认案例来捕获来自队列的任何未定义消息。通常,传递给此案例的任何消息都是编程错误的结果,应如此报告。一旦 VI 或应用程序经过完全测试,任何错误消息都不应触发此消息案例。

 

QMH 模板

        异步消息通信参考库包含 QMH 设计模式的模板。QMH 模板可以放置在 AMC 模板函数面板中空 VI 的图表上。

        下图为QMH设计模式模板图。

 

        QMH 模板针对基于 UI 的 VI,该 VI 在消息处理程序中处理 UI 事件。可以在左侧的消息生成器循环中自定义 VI 处理的 UI 事件。可以在右侧的循环中添加消息处理器案例。

        通过修改消息生成器循环,该模板可以适应其他类型的应用程序和 VI。如有必要,还可以调整消息处理器。该模板应作为参考设计,并根据单个应用程序的需求进行定制。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值