2

gen_fsm動作の実装を生成するMAINプロセスがありますが、このMAINプロセスはスーパーバイザー動作の実装ではなく、単なる別のモジュールです。gen_fsmの実装がGAME_ROOMと呼ばれているとしましょう。私の場合は次のようになります。

  1. 3人の準備ができたら、MAINプロセスは新しいGAME_ROOMを生成します。
  2. gen_fsm:start_link関数を使用して新しいGAME_ROOMを開始します。そのため、GAME_ROOMがエラーで終了した場合、メインプロセスが新しいプロセスを生成して、ダウンしたプロセスを置き換えることができます。
  3. ダウンしたすべてのGAME_ROOMのEXITイベントをMAINプロセスで検出することができました。

問題は次のとおりです。ダウンしたすべてのGAME_ROOM状態を新しい状態に復元する必要があります。私の質問は、gen_fsmのterminate関数を使用してgen_fsmの最新の状態をMAINプロセスに渡すにはどうすればよいので、新しいGAME_ROOMをリスポーンするときに、その状態を渡すことができますか?

4

4 に答える 4

1

process_flag({trap_exit、true})について読み、情報'EXIT'を処理します。

于 2011-05-20T11:41:05.547 に答える
1

簡単な方法の1つは、GAME_ROOMterminate/3が必要な状態情報を含むメッセージをMAINに送信することです。これが機能するためには、GAME_ROOMがMAIN(easy)のpidを知っている必要があり、それterminate/3が実際に呼び出されていることを確認する必要があります。

于 2011-05-22T17:44:15.747 に答える
0

まず第一に、車輪の再発明を避けるために、実装でスーパーバイザーを使用することを検討することをお勧めします。

MAINにETSテーブルを作成して、プロセスのクラッシュに耐えられるgen_fsms内からデータを保存できるようにする可能性があります。

于 2011-05-20T12:02:57.407 に答える
0

私の考えでは、エラーが原因でGAME_ROOMが終了した場合、保存するものは何もありません(状態が有効であることをどのように知るか、そうでない場合はGAME_ROOM内にエラーをトラップします)。

于 2011-05-20T13:46:05.033 に答える