问题标签 [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.

0 投票
3 回答
1950 浏览

erlang - 如何可视化 Erlang gen_fsm

您是否知道任何现有的工具可以从源代码开始以图形方式呈现 Erlang gen_fsm 的图表?

0 投票
1 回答
687 浏览

erlang - 如果 gen_fsm 没有收到消息,则允许它超时

通常,如果我想要 Erlang 进程超时,我会使用以下构造:

OTP 服务器中是否有类似的机制,例如 gen_fsm?我将为我的应用程序的每个活动会话生成 gen_fsm,并且如果在收到消息后超过不活动的超时值,我希望它们退出。

如果需要,我可以编写自己的自定义流程,但如果可能,我更愿意使用 gen_fsm。

0 投票
2 回答
3098 浏览

erlang - Erlang:使用 gen_fsm 实现有限状态机

我正在寻找一个使用 OTP 中的 gen_fsm 在 Erlang 中实现的简单 FSM 的示例。

0 投票
1 回答
1121 浏览

erlang - 我可以在 gen_fsm 状态回调中处理任何收到的消息吗?

我注意到发送到 gen_fsm 进程的 pid 的消息在状态回调中作为事件匹配。这只是偶然还是我可以依赖此功能?

通常我希望发送到 gen_fsm 的一般消息会显示在 handle_info/3 回调中,并认为我必须使用 gen_fsm:send_event 重新发送它。

gen_fsm 是否尝试首先将消息与状态回调匹配,然后始终与 handle_info/3 回调匹配?还是仅当它与状态回调子句不匹配时?

但是,当我尝试它时,我的消息似乎根据调试输出被处理了两次。

所以基本上这个问题也可以这样表述:如何正确处理接收到的消息作为 gen_fsm 状态函数中的事件?


澄清:对于这个问题,应该考虑通过传递消息而发生的一些事件。

我知道,在许多情况下,仅通过对 fsm 使用函数调用来使协议可见是更干净的。

我不太确定这是否会改进提到的 gen_fsm 必须适合的当前框架:不同的协议栈,其中每一层调用一个 connect() 函数来附加(有时启动)较低层。数据包通过调用函数(发送)被发送到较低层,并通过receive消息接收。很像 gen_tcp。

通过查看 gen_fsm 的代码,我已经发现一般消息仅传递给 handle_info,因此问题仍然存在,是直接从 handle_info/3 回调调用状态函数还是使用 gen_fsm:send_event 重新发送。

0 投票
3 回答
492 浏览

erlang - Erlang 中 gen_fsm:start/3 的唯一原子

我目前正在做一个游戏服务器的项目。每个玩家都应该有自己的带有 gen_fsm 行为的进程。要使用 start/3 启动 gen_fsm,我们需要一个唯一的 atom,目前我们使用 make_ref() 并找到了一种方法来将此 ref 变成具有 ref_to_list/1 的 atom。但根据这篇文章,不建议这样做,我同意他的看法。

你将如何解决这个问题?当我们使用本地选项启动 gen_fsm 时,我们需要一个原子来识别它。

0 投票
2 回答
206 浏览

erlang - 获取 gen_fsm PID

我启动 gen_fsm:

我怎样才能得到它的PID?

谢谢你。

0 投票
4 回答
610 浏览

erlang - 如何处理 gen_fsm 的终止

我有一个生成 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 时,我可以传递这些状态?

0 投票
1 回答
2652 浏览

erlang - 何时使用 Gen_Fsm 以及何时使用 Gen_Server?

查看 Gen_Fsm 和 Gen_Server 文档后,我发现它们或多或少具有相似的行为。在我看来,如果有一个循环函数用于发送广播或监听 tcp sock,最好使用 Gen_Fsm,否则使用 gen_server。我想知道它是否正确?

0 投票
1 回答
694 浏览

c++ - 如何在 on_entry 中使用 Boost.MSM is_flag_active?

我想在我的状态的 on_entry 模板函数之一中使用 is_flag_active() 函数:

但是我得到了以下编译错误:

但是在状态机之外,我的意思是如果我首先声明一个状态机,我可以使用 is_flag_active:

如果我使用前端的 is_flag_,我会再次遇到编译器错误(msm::back::state_machine 中没有这样的函数)。

知道如何将 is_flag_active 与 on_entry 一起使用吗?或者,如果不可能,还有其他选择吗?

感谢您的帮助,加博尔

0 投票
1 回答
202 浏览

erlang - 如果没有事件发生,终止 gen_fsm

我希望我的 FSM 终止任何时间事件在每个州的指定时间之后都没有发生。

只有在 FSM 创建后没有事件的情况下,我才能通过在 init 回调中指定超时值来实现这样的场景,但我希望这个功能也适用于所有状态。

有什么简单快捷的解决方案吗?

最好的祝福

马特