#05 如何使用Helper-Loop

某些场合,我们需要某个模块能够主动的轮询获取信息,诸如循环采集数据,监听网络连接等,那么Helper Loop就起到作用了,并非只有Actorframwork中的Actor才能用到Help Loop,在普通的QMH中同样可以。

Self—Messaging

有时候,我们需要在MHL中重复某个case,最简单的就是不停的往队列中重复塞入message,然而这却是一个风险,因为当有其他message进来而模块而无法做到响应。

Help-Loop

为了解决这个问题,我们可以创建一个独立于MHL的Loop,并加上Event Structure作为响应(激活及关闭):添加一个Enable Actor事件用来触发Helper Loop,将Timeout置为0(Time out的时间设定则可以依据跑完此分支内代码所消耗的时间来定,时间设定短了则有可能没执行完timeout 的分支就中断了,我一般设为10ms。),添加一个Disable Actor事件用来关闭Helper Loop,将Timeout置为-1。

当有外部module有Stop Module的事件触发时,则停止Help-Loop。

用法

一般来说,Help Loop可用来两种操作:

使用Timeout重复操作

诸如等待网络连接,数据采集的代码都可以在Timeout分支内完成。

监听Broadcast事件

HelpLoop还可以用来监听其他模块发送过来的message

有个小技巧是在监听的过程中,我们需要动态的控制是否监听数据,则可以采用Register 和 Unregister 事件来处理,这种操作就好像找报社订报纸,报社只负责给客户发送(Broadcast)报纸,而客户可以选择接受(Register)或者不接受(Unregister)。

实际应用

实际应用中,在DAQ Module中,使用Helper Loop用来广播采集的数据,而在Logger Module 和 Sequence Module中采用注册Broadcast 事件用来接收DAQ发送过来的数据。

在Sequence Module中还可以Register或者Unregister注册事件用来控制是否接受来自DAQ Module的数据。

参考

https://forums.ni.com/t5/Delacor-Toolkits-Discussions/Helper-Loop-and-cloneable-modules/td-p/3888394https://www.hampel-soft.com/blog/dqmh-actors-self-messaging-or-helper-loops/#update-20190201

发表评论