代码之家  ›  专栏  ›  技术社区  ›  Peer Stritzinger

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

  •  1
  • Peer Stritzinger  · 技术社区  · 15 年前

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

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

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

    因此,基本上问题也可以这样表述:如何在gen-fsm状态函数中正确地将接收到的消息作为事件处理?


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

    我知道,在很多情况下,只在fsm中使用函数调用使协议可见是一种清洁方法。

    我不确定这是否会改善当前的框架,其中提到的gen-fsm必须适应:不同的协议栈,其中每个层调用connect()函数来附加(有时启动)较低层。数据包通过调用函数(send)发送到较低层ba,并由 receive

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   probsolver    15 年前

    一般消息由handle_info callback处理,除非您的代码中有类似的内容:

    处理信息(信息、状态名、状态数据)-> ?模块:StateName(Info,StateData)。

    这样可以避免重发,但我不建议这样做,也不建议重发。

    通过封装send_event/sync_send_event/send_all_state_event/sync_send_all_state_event的API调用独占地传递事件使协议显式。这是一个正确的事情,因为它更容易理解,维护和文件与edoc。

    推荐文章