gen_fsm module Callback module -------------- --------------- gen_fsm:start_link -----> Module:init/1 gen_fsm:send_event -----> Module:StateName/2 gen_fsm:send_all_state_event -----> Module:handle_event/3 gen_fsm:sync_send_event -----> Module:StateName/3 gen_fsm:sync_send_all_state_event -----> Module:handle_sync_event/4 - -----> Module:handle_info/3 - -----> Module:terminate/3 - -----> Module:code_change/4
上面这东西太重要了,刚才没有看,直接进入代码。所以误以为 sync_send_event 会条用handle_event 导致错误百出
-module(code_lock). -behaviour(gen_fsm). -export([start_link/1]). -export([button/1,sync_button/1]). -export([init/1, locked/3, locked/2, open/2,stop/0,terminate/2,handle_event/3,handle_sync_event/4]). start_link(Code) -> io:format("In ~p,on ~p line start....~n",[?MODULE,?LINE]), gen_fsm:start_link({local, code_lock}, ?MODULE, Code, []). stop()-> gen_fsm:send_all_state_event(code_lock, stop). handle_event(code,stop,StateData)-> ok. button(Digit) -> io:format("In ~p,on ~p line button....~n",[?MODULE,?LINE]), gen_fsm:send_event(code_lock, {button, Digit}). sync_button(Digit) -> io:format("In ~p,on ~p line button....~n",[?MODULE,?LINE]), gen_fsm:sync_send_event(code_lock, {button, Digit}). %gen_fsm:sync_send_all_state_event(code_lock, {button1, Digit}). init(Code) -> io:format("In ~p,on ~p line init....~n",[?MODULE,?LINE]), {ok, locked, {[], Code}}. %{ok, handle_sync_event, {[], Code}}. handle_sync_event({button,Digit}, From, StateName, State) -> io:format("In ~p,on ~p line locked.StateName=~p,State=~p,~n",[?MODULE,?LINE,StateName,State]), {reply,reply,StateName,State}. locked({button, Digit}, From, State) -> io:format("In ~p,on ~p line locked....,SoFar=~p,Code=~p,~n",[?MODULE,?LINE,From, State]), gen_fsm:reply(From, rrrrrrrrr), {next_state,locked,State}. locked({button, Digit}, {SoFar, Code}) -> io:format("In ~p,on ~p line locked....,SoFar=~p,Code=~p,~n",[?MODULE,?LINE,SoFar,Code]), %% case [Digit|SoFar] of % Incomplete when length(Incomplete)<length(Code) -> % {next_state, locked, {Incomplete, Code}}; % Code -> do_unlock(), % {next_state, open, {[], Code}, 3000}; % _Wrong -> % {next_state, locked, {[], Code}} {next_state, open, {[], Code}, 3000}. %%end. open(timeout, State) -> do_lock(), {next_state, locked, State}. do_unlock()-> io:format("do_unlock~n"). do_lock()-> io:format("do_lock~n"). terminate(Rease,State)-> io:format("terminate Rase=~p,State =~p ~n",[Rease,State]).运行结果 16> code_lock:start_link(12). In code_lock,on 7 line start.... {error,{already_started,<0.68.0>}} 17> code_lock:sync_button(12). In code_lock,on 17 line button.... In code_lock,on 29 line locked....,SoFar={<0.61.0>,#Ref<0.0.0.490>},Code={[], 12}, rrrrrrrrr 18> 正确返回了rrrrrrrr