問題タブ [gen-fsm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - Erlang gen_fsm を視覚化する方法
ソース コードから開始して、Erlang gen_fsm のダイアグラムをグラフィカルにレンダリングする既存のツールを知っていますか?
erlang - メッセージを受信しない場合にgen_fsmがタイムアウトすることを許可する
通常、Erlangプロセスのタイムアウトが必要な場合は、次の構成を使用します。
gen_fsmなどのOTPサーバーに同様のメカニズムがありますか?アプリケーションとのアクティブなセッションごとにgen_fsmを生成し、メッセージの受信後に非アクティブのタイムアウト値を超えた場合にそれらを終了させたいと考えています。
必要に応じて独自のカスタムプロセスを作成できますが、可能であればgen_fsmを使用することをお勧めします。
erlang - Erlang: gen_fsm を使用して有限ステート マシンを実装する
OTP の gen_fsm を使用して Erlang に実装された単純な FSM の例を探しています。
erlang - 受信したメッセージを gen_fsm 状態のコールバックで処理できますか?
gen_fsm プロセスの pid に送信されたメッセージは、状態コールバックでイベントとして一致することに気付きました。これは単なる偶然ですか、それともこの機能に頼ることができますか?
通常、gen_fsm に送信された一般的なメッセージが handle_info/3 コールバックに表示されることを期待し、gen_fsm:send_event を使用して再送信する必要があると考えていました。
gen_fsm はメッセージを最初に状態コールバックに一致させ、次に常に handle_info/3 コールバックに一致させようとしますか? それとも、状態コールバック句に一致しない場合のみですか?
ただし、試してみると、デバッグ出力によると、メッセージが2回処理されているようです。
したがって、基本的には、次のように質問することもできます: 受信したメッセージを gen_fsm 状態関数のイベントとして正しく処理する方法は?
明確化:メッセージが渡されることによってイベントの一部が発生していることは、この質問に与えられていると見なす必要があります。
多くの場合、fsm への関数呼び出しのみを使用してプロトコルを可視化する方がクリーンであることは承知しています。
これが、前述の gen_fsm が適合しなければならない現在のフレームワークを改善するかどうかはよくわかりません。各層が connect() 関数を呼び出して下位層をアタッチする (場合によっては開始する) 多様なプロトコル スタック。パケットは、関数を呼び出すことで下位層に送信され (send) receive
、メッセージを送信することで受信されます。gen_tcp によく似ています。
gen_fsm のコードを見ると、一般的なメッセージは handle_info にのみ渡されることがわかったので、問題は、handle_info/3 コールバックから状態関数を直接呼び出すか、gen_fsm:send_event を使用して再送信するかだけです。
erlang - Erlang の gen_fsm:start/3 の一意のアトム
私は現在、ゲームサーバーを作成するプロジェクトに参加しています。すべてのプレイヤーは、gen_fsm 動作を備えた独自のプロセスを持っていると想定されています。start/3 で gen_fsm を開始するには、一意のアトムが必要です。現在、make_ref() を使用して、この ref を ref_to_list/1 でアトムにする方法を見つけました。しかし、この投稿によると、それは推奨されておらず、私は彼に同意します.
この問題をどのように解決しますか?local オプションで gen_fsm を開始するとき、それを識別するためのアトムが必要です。
erlang - gen_fsm PID を取得する
gen_fsm を開始します。
どうすればPIDを取得できますか?
ありがとうございました。
erlang - gen_fsmの終了を処理する方法
gen_fsm動作の実装を生成するMAINプロセスがありますが、このMAINプロセスはスーパーバイザー動作の実装ではなく、単なる別のモジュールです。gen_fsmの実装がGAME_ROOMと呼ばれているとしましょう。私の場合は次のようになります。
- 3人の準備ができたら、MAINプロセスは新しいGAME_ROOMを生成します。
- gen_fsm:start_link関数を使用して新しいGAME_ROOMを開始します。そのため、GAME_ROOMがエラーで終了した場合、メインプロセスが新しいプロセスを生成して、ダウンしたプロセスを置き換えることができます。
- ダウンしたすべてのGAME_ROOMのEXITイベントをMAINプロセスで検出することができました。
問題は次のとおりです。ダウンしたすべてのGAME_ROOM状態を新しい状態に復元する必要があります。私の質問は、gen_fsmのterminate関数を使用してgen_fsmの最新の状態をMAINプロセスに渡すにはどうすればよいので、新しいGAME_ROOMをリスポーンするときに、その状態を渡すことができますか?
erlang - Gen_Fsm をいつ使用し、いつ Gen_Server を使用するか?
Gen_Fsm と Gen_Server のドキュメントを調べたところ、多かれ少なかれ、似たような動作をすることがわかりました。私の意見では、ブロードキャストを送信したり、tcp sock をリッスンしたりするためのループ関数が 1 つある場合は、Gen_Fsm を使用するか、gen_server を使用することをお勧めします。私はそれが正しいかどうか知りたいですか?
c++ - on_entry内でBoost.MSMis_flag_activeを使用する方法は?
州のon_entryテンプレート関数の1つでis_flag_active()関数を使用したいと思います。
ただし、次のコンパイルエラーが発生しました。
ただし、ステートマシンの外部では、最初にステートマシンを宣言する場合、is_flag_activeを使用できます。
front_endのis_flag_を使用すると、コンパイラエラーが再び発生します(msm :: back :: state_machineにはそのような関数はありません)。
is_flag_activeをon_entryと一緒に使用する方法はありますか?または、それが不可能な場合、代替手段はありますか?
助けてくれてありがとう、Gabor
erlang - イベントが発生しない場合は gen_fsm を終了します
すべての状態で指定された時間が経過してもイベントが発生しない場合はいつでも FSM を終了させたいと考えています。
init コールバックでタイムアウト値を指定することにより、FSM の作成後にイベントがない場合にのみ、このようなシナリオを実現できますが、この機能をすべての状態でも機能させたいと考えています。
簡単で迅速な解決策はありますか?
よろしくお願いします
マット