Java Apache Commons SCXML状态机框架
Java Apache Commons SCXML状态机框架,java,apache-commons,Java,Apache Commons,我试图使用ApacheScXML为Java应用程序定义一个状态机。但是,我遇到了一个问题,我不确定这是因为SCXML框架还是我做错了什么。 我的测试应用程序基于以下示例(没有android位): 文件StopWatch.java() 问题是上述状态在每次转换中只调用一次。这是正确的吗?只要状态机保持在给定状态,状态函数就不应该被连续调用吗 谢谢 你为什么期待这种行为?您的state类只需要了解转换。一旦你过渡,你就处于稳定状态。你为什么会期望这种行为?您的state类只需要了解转换。一旦你过渡
我试图使用ApacheScXML为Java应用程序定义一个状态机。但是,我遇到了一个问题,我不确定这是因为SCXML框架还是我做错了什么。
我的测试应用程序基于以下示例(没有android位):
文件StopWatch.java() 问题是上述状态在每次转换中只调用一次。这是正确的吗?只要状态机保持在给定状态,状态函数就不应该被连续调用吗
谢谢 你为什么期待这种行为?您的state类只需要了解转换。一旦你过渡,你就处于稳定状态。你为什么会期望这种行为?您的state类只需要了解转换。一旦你过渡,你就处于稳定状态。你好,以防其他人发现这个问题 上述示例仅在已定义示例的上下文中有效 这些状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态A并触发定义的转换事件时,状态机才会前进。这可以在下面的代码片段中看到
<state id="reset">
<transition event="watch.start" target="running"/>
</state>
此侦听器调用具有相应状态名的方法,以尝试新状态
public void onEntry(final TransitionTarget entered) {
invoke(entered.getId());
}
因此,如果希望连续调用您的状态,只需删除状态机(SCXML)描述中的转换保护。您好,以防其他人发现此问题 上述示例仅在已定义示例的上下文中有效 这些状态不会自动转换,因为它们受到事件的保护。因此,只有当状态机处于状态A并触发定义的转换事件时,状态机才会前进。这可以在下面的代码片段中看到
<state id="reset">
<transition event="watch.start" target="running"/>
</state>
此侦听器调用具有相应状态名的方法,以尝试新状态
public void onEntry(final TransitionTarget entered) {
invoke(entered.getId());
}
因此,如果希望连续调用状态,只需删除状态机(SCXML)描述中的转换保护。您误解了状态机的行为。状态的本质是,有时状态机对象会满足某些条件来执行某些活动或等待某些事件。当然,你可以通过在stopwatch类的函数中定义循环来描述,但是有什么意义吗?运行的函数有一个计时器线程,计时器任务可以看作是一个循环,不是吗?运行状态执行线程任务,只需等待事件退出此状态并停止任务。您误解了状态机的行为。状态的本质是,有时状态机对象会满足某些条件来执行某些活动或等待某些事件。当然,你可以通过在stopwatch类的函数中定义循环来描述,但是有什么意义吗?运行的函数有一个计时器线程,计时器任务可以看作是一个循环,不是吗?运行状态执行线程任务,只需等待事件退出此状态并停止任务。Hi-感谢您的回答。我一直认为状态机是由一个while循环和一个switch语句组成的,也就是说,只要当前状态是有效的,我就希望它能被执行——看答案,我当然可以在上面的状态中有一个while循环,但我认为这不是正确的做法,我认为框架可能期望状态函数在处理转换事件后返回。您好,谢谢您的回答。我一直认为状态机是由一个while循环和一个switch语句组成的,也就是说,只要当前状态是有效的,我就希望它能被执行——看答案,我当然可以在上面的状态中有一个while循环,但我认为这不是正确的做法,我认为框架可能期望状态函数在处理转换事件后返回。