2009-09-11 25 views
0


Apache SCXMLを使用してJavaアプリケーション用の状態マシンを定義しようとしています。しかし、私は問題に遭遇しましたが、これがSCXMLフレームワークか私が間違っていることが原因であるかどうかはわかりません。
http://commons.apache.org/scxml/usecases/scxml-stopwatch-on-android.htmlApache Commons SCXMLステートマシンフレームワーク

ファイル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回と呼ばれます。これは正しいです?状態機械が与えられた状態のままである限り、状態関数は連続的に呼び出されるべきではないか?

ありがとうございます!

答えて

0

なぜこの動作が期待されますか?あなたの州のクラスは、移行について知る必要があります。移行したら、安定した状態になります。

+0

こんにちは - あなたの答えに感謝します。私はいつもステートマシンをwhileループとswitch文で構成されていると考えていました。つまり、有効な限り、現在の状態が実行されることを期待しています - http://stackoverflow.com/questions/133214への回答を参照してください。/is-there-a-typical-state-machine-implementation-pattern もちろん、上記の州の中にwhileループがあるかもしれませんが、これは正しいことではないと私は考えています状態は、遷移イベントを処理した後に戻るように機能する。 –

3

こんにちは、他の人がこの質問を見つけることがあります。

上記の例は、定義済みstate machineの例でのみ機能します。

状態は、イベントによって保護されるため自動的に遷移しません。したがって、状態マシンが状態Aにあり、定義された遷移イベントが起動された場合に限り、状態機械は前進する。これは、付記として

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

以下のスニペットに見ることができる、StopWatch例で定義された状態と同じ名前のメソッドの実行がAbstractStateMachine自体で定義されたイベントリスナーによって守られます。 initializeメソッドの一部として、新しいリスナーが登録されます。

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

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

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

あなたの状態が継続的に呼ばれるようにしたいのであれば、あなただけでは、遷移ガードを削除する必要がありますステートマシン(SCXML)の説明。

0

あなたはステートマシンの動作を誤解しています。状態の本質は、時々、状態マシンオブジェクトがある種の活動を実行するか或るイベントを待つための特定の条件を満たすことである。もちろん、あなたはstopwatchクラスの関数のループを定義することで記述できますが、何か重要ですか?実行中の関数はタイマスレッドを持ち、タイマータスクはループと見なすことができますか?実行状態はスレッドタスクを実行し、この状態を終了してタスクを停止するためにイベントを待機させるだけです。

関連する問題