首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Commons SCXML状态机框架

Apache Commons SCXML状态机框架
EN

Stack Overflow用户
提问于 2009-09-11 12:20:55
回答 3查看 2.8K关注 0票数 0

我正在尝试使用Apache SCXML为Java应用程序定义一个状态机。然而,我遇到了一个问题,我不确定这是由于SCXML框架还是我做错了什么。

我将我的测试应用程序基于以下示例(没有android位):

http://commons.apache.org/scxml/usecases/scxml-stopwatch-on-android.html

文件StopWatch.java (http://commons.apache.org/scxml/xref-test/org/apache/commons/scxml/env/StopWatch.html)

代码语言:javascript
复制
public class StopWatch extends AbstractStateMachine {
    public void reset() {

    }

    public void running() {
    }

    public void paused() {
    }

    public void stopped() {
    }
}

问题是上述状态在每个转换中只被调用一次。这是正确的吗?只要状态机保持给定的状态,就不应该连续调用状态函数吗?

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2011-02-17 07:04:49

嗨,只是为了防止其他人发现这个问题。

上面的示例仅在定义的state machine示例的上下文中有效。

状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态A并且触发了定义的转换事件时,状态机才会前进。这可以在下面的代码片段中看到

代码语言:javascript
复制
<state id="reset">
    <transition event="watch.start" target="running"/>
</state>

作为补充说明,与StopWatch示例中定义的状态同名的方法的执行由AbstractStateMachine本身中定义的EventListener保护。作为initialize方法的一部分,注册一个新的侦听器。

代码语言:javascript
复制
engine.addListener(stateMachine, new EntryListener());

此监听器调用具有新状态的相应状态名称onEntry的方法

代码语言:javascript
复制
public void onEntry(final TransitionTarget entered) {
    invoke(entered.getId());
}

因此,如果希望连续调用状态,只需删除状态机(SCXML)描述中的转换保护。

票数 3
EN

Stack Overflow用户

发布于 2009-09-11 19:54:59

为什么你会期望这种行为呢?您的状态类只需要知道转换。一旦你转变了,你就处于一个稳定的状态。

票数 0
EN

Stack Overflow用户

发布于 2015-11-28 10:15:46

你误解了状态机的行为。状态的本质是,在某些情况下,状态机对象将满足某些条件来执行某些活动或等待某些事件。当然,你可以通过在秒表类的函数中定义循环来描述,但是有什么意义吗?运行的函数有一个计时器线程,一个计时器任务可以被视为一个循环,不是吗?运行状态执行线程任务,并等待事件退出此状态并停止任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1410539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档