0


ApacheSCXMLを使用して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

public class StopWatch extends AbstractStateMachine {
    public void reset() {

    }

    public void running() {
    }

    public void paused() {
    }

    public void stopped() {
    }
}

問題は、上記の状態が遷移ごとに1回だけ呼び出されることです。これは正しいです?ステートマシンが指定された状態にある限り、状態関数を継続的に呼び出すべきではありませんか?

ありがとう!

4

3 に答える 3

3

こんにちは、他の人がこの質問を見つけた場合に備えて。

上記の例は、定義されたステート マシンの例のコンテキストでのみ機能します。

状態はイベントによって保護されているため、自動的に遷移しません。そのため、ステート マシンが状態 A にあり、定義された遷移イベントが発生した場合にのみ、ステート マシンが進みます。これは、以下のスニペットで見ることができます

<state id="reset">
    <transition event="watch.start" target="running"/>
</state>

追加の注意として、例で定義されている状態と同じ名前のメソッドの実行は、それ自体StopWatchで定義された EventListener によって保護されAbstractStateMachineます。初期化メソッドの一部として、新しいリスナーが登録されます。

engine.addListener(stateMachine, new EntryListener());

このリスナーは、対応する状態名 onEntry を持つメソッドを新しい状態に呼び出します

public void onEntry(final TransitionTarget entered) {
    invoke(entered.getId());
}

したがって、状態を継続的に呼び出す必要がある場合は、状態マシン (SCXML) の記述で遷移ガードを削除するだけです。

于 2011-02-16T23:04:48.877 に答える
0

なぜこの動作を期待するのですか?状態クラスは、遷移について知る必要があるだけです。移行すると、定常状態になります。

于 2009-09-11T19:54:59.027 に答える