SCXML和QScxml使用总结
来源:互联网 发布:mac口红哪个适合秋冬 编辑:程序博客网 时间:2024/06/07 22:38
先来简单介绍一下SCXML的格式,以
<scxml initial="FirstState" version="0.9" xmlns="http://www.w3.org/2005/07/scxml">
作为整个SCXML的开头,scxml标签旁的initial表示状态机启动之后进入的第一个初始化状态,在这里我写了FirstState,表示状态几一启动,就进入了FirstState.
<state id="FirstState" initial="FirstChildNode">
以state标签开头表示了状态的基本概念,其中的id是作为该状态的索引号给你之后写target进行索引,这个时候同学会看到又出现了一个initial,这时的FirstChildNode表示此时的FirstState并不是一个原子状态,而是一个组合状态的父状态。而FirstChildNode恰恰就是它的子状态。也就是说进入了FirstState之后,就会立即进入FirstChildNode,期间如果你调用了<onentry>和<onexit>标签,你会发现调用了多次,不必奇怪,其实你的状态是进入了一层一层中的最里层,每进一层就会调用<onentry>和<onexit>。
<transition event="Key.A" target="SecondState"></transition><transition event="Key.B" target="ThirdState"></transition>
又来新东西了,这个<transition>标签表示真正的事务处理过程,之后的event属性表示你传递给QScxml中的postNamedEvent(const QString)函数中的QString,所以我之前提过那个id的作用,就是全局的索引号,同时请注意:SCXML中默认的event是前缀查找,也就是说对于event="GameTest"来说,你输入"GameTest","Game","Game.","Game.*"效果是完全一样的,不过我试了下在QScxml中只有第一种和第三种有效(官方说明)。之后的<target>自然很好理解,就是你在这个状态下,经过了event事件,达到了target状态(target不能接收函数,必须是字符串状态变量而cond可以接收函数或者字符串)。例子中就表示无论你在FirstState中的哪个孩子中,只要你收到了Key.A事件,你都会跳出子状态乃至父状态,直接跳到对应的SecondState中去。注意:写在父状态中的translation是给它以及它的孩子全局共享的,如果你觉得你可能在孩子节点中对于某一个事件你不满意,你想要重写,那你完全可以在FirstChildNode中写下
<transition event="Key.A" target="FourhState"></transition><transition event="Key.B" target="FifthState"></transition>
这个时候状态机会优先处理最子层的事务处理,如果状态机发现在最子层并没有完成该事件(包括没有找到该translation和找到translation可是cond为false)都会将事件向上传递给父状态进行处理。
在来说说比较有用的标签<cond>,这个标签可以放在<translation>中也可以放在<if>中,当放在<translation中时>
<transition event="Key.A" target="FourhState" cond="isTrue"></transition>
表明当isTrue为true的时候,target才真正进行转移(在这里isTrue即可以是简单变量也可以是script函数来返回bool值),比较常用的用法有
<translation event="Key.A"> <if cond="isTrue()"> <script>FuncA()</script><elseif cond="isFalse()"/> <script>FuncB()</script><else/> <script>FuncC()</script></if></translation>
表明事件Key.A来的时候进行cond判断来调用相应的script。
另外我们也可以用到状态机在上而下处理事件的机制,来进行灵活的target动态转换工作.
<transition event="Key.A" target="A" cond="isTrue()" /><transition event="Key.A" target="B" >
细心的你一定会发现,怎么两个translation的event一样。其实这种用法在W3C的examples中也提到过,因为状态机在上而下的处理机制,你可以在断言为false的时候有一个默认的target,而在true的时候进入你事先设定的target,可以非常灵活的使用这种机制进行判断.
另外介绍一下两个也比较重要的标签,在上文也提到过<onentry>和<onexit>,
<onentry> <script> enterState("A"); </script></onentry><onexit> <script> exitState("B"); </script>
表明在进入和退出该状态的时候自动触发的事件,这里默认调用的script,你可以很灵活的控制状态切换时应该需要的工作.
QScxml中有一个功能非常强大的函数
void QScxml::registerObject (QObject* o, const QString & name, bool recursive)
用它进行注册之后,你可以在SCXML的文件中写各种script function,比如你注册的时候m_scxml->registerObject(this, "Widget", true),这个时候你就可以在SCXML文件中写下
<script> function show() { Widget.show(); }</script>
表明无论你在translation还是onentry还是onexit中的<script>标签写show()这个函数,你最终都会通过QScxml这个强大的类让你可以和它进行交互。如果你嫌写script function麻烦,
你也可以直接在<script>标签中写上
Widget.show();
一样可以直接运行。script function的强大不仅仅在于可以通过QScxml让你和你的对象进行交互,同时它也可以用来做断言cond判断,比如
function isTrue(){ return Widget.isGood(); }
你可以非常灵活的实现你自己类的断言函数,配合之前的translation中的cond做到动态切换target,非常方便。
今天就简单介绍到这里,在开始接触SCXML的时候发现国内的资料很少,写这篇博文也当贡献自己的一份力了,更多的内容需要你自己去挖掘,希望你会喜欢这篇文章,留下你的脚印,给我支持,谢谢:)
- SCXML和QScxml使用总结
- SCXML有限状态机规范详解与使用
- SCXML有限状态机规范详解与使用
- Apache SCXML 状态机
- SCXML有限状态自动机
- Dubbo总结和使用
- Commons SCXML 中模型的类结构
- apache common scxml框架学习DEMO
- Apache Commons-SCXML系列之项目介绍
- Apache Commons-SCXML系列之"HelloWorld"
- Apache Commons-SCXML系列之Demo:"秒表"
- State Chart XML (SCXML) 状态机规范
- showModalDialog和showModelessDialog使用总结
- ExtJS使用总结和参考
- Git和GitHub使用总结
- MinGW安装和使用总结
- Scroller使用分析和总结
- poll() 和select()使用总结
- java连接Oracle详解
- appium===Python+Appium环境部署教程
- nginx安装与配置
- Luogu 1074(DFS)(NOIP 2009)
- Percona XtraBackup 安装介绍篇
- SCXML和QScxml使用总结
- 爬取js动态生成后的数据
- 公司的服务类型简介
- git add, commit, push如何撤销
- 水平分库分表的关键步骤和技术难点
- Volley的框架解读五(网络调度NetworkDispatcher)
- [dataTables使用的坑]dataTables和angular的结合
- python3正确安装scipy
- 一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)