关于gen_fsm 的一些理解

来源:互联网 发布:cstpcd数据库 编辑:程序博客网 时间:2024/05/20 13:36
gen_fsm module                    Callback module--------------                    ---------------gen_fsm:start_link                -----> Module:init/1gen_fsm:send_event                -----> Module:StateName/2gen_fsm:send_all_state_event      -----> Module:handle_event/3gen_fsm:sync_send_event           -----> Module:StateName/3gen_fsm:sync_send_all_state_event -----> Module:handle_sync_event/4-                                 -----> Module:handle_info/3-                                 -----> Module:terminate/3-                                 -----> Module:code_change/4
1:gen_fsm 可以应用状态机,看了yourihua的 

Erlang OTP设计原则Gen_Fsm行为 有感。 proc_lib:start_link(

gen_fsm:start_link -> gen:start ->gen:do_spawn ->proc_lib_start_link -> 其实都是通过apply(M,F,A) 最后这是mod:init(Arg) ,所以gen_fsm:start_link 里面代码就有mod:init .
gen_fsm:start_link                -----> Module:init/1
gen_fsm:send_event                -----> Module:StateName/2  是init 通过初始化 {ok,static,State }, static 就是StateName,   所以就调用调了 Module:StateName/2  再次调用就可以改变状态了。
其实是通过下面实现的,
Event这是 gen_fsm:send_event/2 向gen_fsm 发送的状态
dispatch({'$gen_event', Event}, Mod, StateName, StateData) ->    Mod:StateName(Event, StateData);dispatch({'$gen_all_state_event', Event}, Mod, StateName, StateData) ->    Mod:handle_event(Event, StateName, StateData);dispatch({'$gen_sync_event', From, Event}, Mod, StateName, StateData) ->    Mod:StateName(Event, From, StateData);dispatch({'$gen_sync_all_state_event', From, Event}, Mod, StateName, StateData) ->    Mod:handle_sync_event(Event, From, StateName, StateData);dispatch({timeout, Ref, {'$gen_timer', Msg}}, Mod, StateName, StateData) ->    Mod:StateName({timeout, Ref, Msg}, StateData);dispatch({timeout, _Ref, {'$gen_event', Event}}, Mod, StateName, StateData) ->    Mod:StateName(Event, StateData);dispatch(Info, Mod, StateName, StateData) ->    Mod:handle_info(Info, StateName, StateData).

0 0
原创粉丝点击