自己写的简单的 gen_fsm有限状态机的小例子:
-module(test_fsm). -export([start_link/0,stand/2,move/2,dead/2,stop/0]). -export([handle_stand/0,handle_move/0]). -behaviour(gen_fsm). %% -export([init/1,handle_info/3,handle_event/3,handle_sync_event/4,code_change/4,terminate/3]). %% start_link() -> gen_fsm:start_link({local,?MODULE},?MODULE,[],[]). %% init([])-> io:format("init....~n",[]), {ok,stand,stand}. handle_info(_Info,_StateName,_State) -> {next_state,_StateName,_State}. handle_event(_Event,StateName,State) -> {next_State,StateName,State}; handle_event(stop,StateName,State) -> {stop,normal,State}. handle_sync_event(_Event,_From,StateName,State) -> Reply = ok, {reply,Reply,StateName,State}. code_change(_OldVsn,StateName,State,_Extra) -> {ok,StateName,State}. terminate(_Reason,_StateName,_State) -> io:format("terminate......~n",[]), ok. stand(stand,State) -> io:format("stand....~n",[]), {next_state,move,State}. move(move,State) -> io:format("move......~n",[]), {next_state,dead,State,5000}. %%五秒后将执行死亡 dead(timeout,State) -> io:format("dead.........~n",[]), proc_lib:hibernate(gen_fsm, enter_loop, [?MODULE, [], stand,State]). %%清空stack,重新进入stand %%{next_state,stand,State}. %%==============外部接口函数============== handle_stand() -> gen_fsm:send_event(?MODULE,stand). handle_move() -> gen_fsm:send_event(?MODULE,move). %%======================stop=== stop() -> gen_fsm:send_all_state_event(?MODULE,stop).