本文介绍Actor Framework(下文简称“AF”)中可重写方法的主要作用和使用方法,即这些方法什么情况下需要重写,重写的他们能干什么。
以LabVIEW2020为例,AF支持7个可重写的VI:
Pre Launch Init.vi[启动前初始化]:
AF保证Pre Launch Init在Actor启动后首先执行,一般用于初始化私有数据。Pre Launch Init.vi[启动前初始化] 与 Stop Core.vi[停止核心] 这两个方法一般成对重写。
重写此VI应注意以下几点:
A、此方法内不可以启动其他操作者,否则会造成程序锁死。
B、此方法可以使用“获取当前类带入队列”函数给自己发消息。发送的消息会存在自己的消息队列中,因为此时Actor Core还没有执行,无法处理你发送的消息,待本VI运行完毕,Actor Core执行后会有限处理这里发送的消息。注意,这里不能发送需要答复的消息,否则会锁死。
C、可以把启动其他操作者的程序写在VI里并创建消息,在Pre Launch Init.vi中发送此消息到自身消息队列。
Stop Core.vi[停止核心]:
AF架构确保Stop Core在Actor即将关闭时最后执行,一般用于释放私有数据引用。
Receive Message.vi[接收消息]
这个方法在每次Actor执行消息时的前和后执行。举个例子,我们的Actor私有数据里添加一个“当前消息”的私有数据,我们希望这个当前消息用于存储当前正在运行的消息本身。
再举个不是很恰当的例子,我们想让Actor的所有错误无效,直接断开error out,错误就传不出去了。(应用中不要这么做,这回导致Actor关不掉)
Handle Error.vi[错误处理]
当消息执行时有“error out”输出时执行此VI。这里要注意,Actor默认的方法,所有error只要发生,Actor就会停止。如果某个错误你不想停止Actor,则Stop actor?和error out的值都要修改。但是不能直接断开error out和stop actor?,因为Actor停止也是通过一个特定的error实现的,断开这两个接端会导致Actor无法停止。
Handle Last Ack Core.vi[处理最近一次确认_核心]
这个方法用的比较少,也比较难理解。简单的解释,当Actor A使用“启动嵌套操作者”这个函数调用了另一个Actor B,如果Actor B自己停止了(此时Actor A还没停止),在“临死”之前最后一口气的时候会触发Actor A的这个方法。
这里来个延伸解释,LabVIEW的Actor面板里有两个停止函数,分别是标准定制和紧急停止。这两个函数有什么区别呢?
比如,Actor A调用Actor B,Actor B调用 Actor C。
对B标准停止:只停止自己和自己下层的Actor。B和C都停止。
对B紧急停止:会把上层的所有Actor一起停止。A B C都停止。
这里面紧急停止之所以可以把A也停止掉,就是靠Handle Last Ack Core.vi[处理最近一次确认_核心]实现的。感兴趣的可以看一下AF的源码。
Substitute Actor.vi[替换操作者]
额…新出的,没用过。
Actor Core.vi[操作者核心]
这个方法不多讲,是AF最常用的核心。这里只强调一点,大家好好体会。