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
分享到:
相关推荐
- 处理连接请求,为每个新连接创建一个新的进程(通常是一个gen_server或gen_fsm行为)。 - 注册和登录逻辑,处理用户认证请求。 - 监听和转发消息,确保消息在正确用户间传递。 - 错误处理和异常恢复,确保系统的...
Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...
OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以帮助我们构建高效、可扩展的服务。 首先,我们需要理解什么是非阻塞TCP服务器。在Erlang中,"非阻塞"指...
- **独立Gen_Fsm**:解释了如何处理独立的Gen_Fsm实例。 - **处理其他消息**:讲解了如何处理非状态事件的消息。 - **Gen_Event 行为** - **事件处理原则**:介绍了Gen_Event的行为模式。 - **示例**:提供了...
行为(Behavior)是一组预定义的模式,用于实现常见类型的进程,如服务器进程(Gen_Server)、有限状态机(Gen_Fsm)、事件处理器(Gen_Event)和监督进程(Supervisor)。这些行为模式通过行为模块和回调模块的分离...
纯函数式FSM仍然是我的首选方法(与gen_statem相对),但是您不需要此库。 规则的数据结构(例如映射或结构)以及多子句中的模式匹配将非常适合您。 Fsm是纯功能有限状态机。 与gen_fsm不同,它不会在自己的进程中...
- **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例**:提供了一个Gen_Fsm行为的实例。 - **2.3.3 启动一个Gen_Fsm**:如何启动一个有限状态机。 - **2.3.4 事情通知**:事件被...
5. Gen_FSM(Finite State Machines): `gen_fsm.html`涵盖了生成有限状态机的行为,它允许开发人员创建具有多个状态和转换规则的进程。这种行为模式适用于处理事件驱动的、有明确状态变化的应用。 6. Gen_Event...
* 游戏逻辑层:使用Erlang的Actor模型和gen_fsm行为树来实现游戏逻辑。 * 网络层:使用Ranch和Cowboy框架来实现网络层,处理客户端的连接和通信。 * 数据库层:使用Erlang的ETS、Mnesia、MySQL、MongoDB等数据库来...
- **通知事件**:通过`gen_fsm:send_event/2`函数发送事件。 - **超时**:可以通过设置定时器来触发状态转换。 - **所有状态事件**:某些事件可以在任何状态下被处理。 - **停止**:使用`gen_fsm:stop/1`函数停止。 ...
OTP还提供了如GenServer、GenEvent、Gen_fsm等预定义的行为,它们为常见的并发模式提供了标准化的实现。 **GenServer** 行为是一种常用的服务器模式,它简化了状态管理和错误处理。GenServer提供了异步调用、同步...
Erlang提供了一些预定义的行为模式,如gen_server、gen_event和gen_fsm等,它们为实现特定类型的服务提供了模板。echatServer可能使用gen_server行为来实现服务器的核心逻辑,包括用户注册、登录、发送和接收消息等...
"LAB_6v1_pulse_vhdl_gen_源码" 提供的是一个使用VHDL编写的脉冲发生器的源代码。脉冲发生器在数字电路中扮演着重要角色,它能够产生具有特定时序和特性的脉冲信号,这些信号在各种应用场景中,如计时、触发、同步等...
1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...
OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...
这个库的主要目的是提供一种工具,帮助开发者构建复杂而灵活的状态管理机制,它受到了Erlang/OTP中的gen_fsm行为的启发。在Erlang中,gen_fsm是一种通用状态机行为,用于处理具有多个状态和状态转换的并发系统。 **...
7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...