2

我有一个生成 gen_fsm 行为实现的主进程,但这个主进程不是主管行为的实现,它只是另一个模块。假设 gen_fsm 的实现称为 GAME_ROOM。我的情况是这样的:

  1. 当有 3 个人准备好时,主进程将产生一个新的 GAME_ROOM。
  2. 我使用 gen_fsm:start_link 函数来启动一个新的 GAME_ROOM,所以如果 GAME_ROOM 错误退出,我的 MAIN 进程可以产生一个新的进程,以替换停机的进程。
  3. 我设法让我的主进程检测到所有被击落的 GAME_ROOM 的 EXIT 事件

问题是:我需要在新的 GAME_ROOM 状态中恢复所有已关闭的状态。我的问题是:如何使用 gen_fsm 的终止功能将 gen_fsm 的最新状态传递给我的 MAIN 进程,所以当我重生一个新的 GAME_ROOM 时,我可以传递这些状态?

4

4 回答 4

1

阅读 process_flag ({trap_exit, true}) 并处理信息“EXIT”。

于 2011-05-20T11:41:05.547 回答
1

一种简单的方法是让 GAME_ROOMterminate/3向 MAIN 发送带有必要状态信息的消息。为此,GAME_ROOM 必须知道 MAIN 的 pid(简单),并且您必须确定它terminate/3确实被调用了。

于 2011-05-22T17:44:15.747 回答
0

我的信念是,如果 GAME_ROOM 因错误而退出,则没有什么可保存的(你怎么知道你的状态是有效的,否则你会在 GAME_ROOM 中捕获错误)。

于 2011-05-20T13:46:05.033 回答
0

首先,我真的建议你在你的实现中考虑使用监督者,以避免重新发明轮子。

一种可能是在您的 MAIN 中创建一个 ETS 表,这样您就可以从您的 gen_fsms 中存储数据,这些数据可以在进程崩溃后幸免于难。

于 2011-05-20T12:02:57.407 回答