`
langzhe
  • 浏览: 286311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gen_fsm

 
阅读更多

 

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

 

1
4
分享到:
评论

相关推荐

    基于Erlang的gen_tcp聊天室代码,功能完整

    - 处理连接请求,为每个新连接创建一个新的进程(通常是一个gen_server或gen_fsm行为)。 - 注册和登录逻辑,处理用户认证请求。 - 监听和转发消息,确保消息在正确用户间传递。 - 错误处理和异常恢复,确保系统的...

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    使用OTP原理构建一个非阻塞的TCP服务器

    OTP为开发健壮、容错的应用提供了强大的框架,它包含了一系列行为模式,如gen_server和gen_fsm,这些模式可以帮助我们构建高效、可扩展的服务。 首先,我们需要理解什么是非阻塞TCP服务器。在Erlang中,"非阻塞"指...

    erlang的翻译文档

    - **独立Gen_Fsm**:解释了如何处理独立的Gen_Fsm实例。 - **处理其他消息**:讲解了如何处理非状态事件的消息。 - **Gen_Event 行为** - **事件处理原则**:介绍了Gen_Event的行为模式。 - **示例**:提供了...

    Erlang_OTP_设计原理(含目录).pdf

    行为(Behavior)是一组预定义的模式,用于实现常见类型的进程,如服务器进程(Gen_Server)、有限状态机(Gen_Fsm)、事件处理器(Gen_Event)和监督进程(Supervisor)。这些行为模式通过行为模块和回调模块的分离...

    fsm:有限状态机数据结构

    纯函数式FSM仍然是我的首选方法(与gen_statem相对),但是您不需要此库。 规则的数据结构(例如映射或结构)以及多子句中的模式匹配将非常适合您。 Fsm是纯功能有限状态机。 与gen_fsm不同,它不会在自己的进程中...

    Erlang中文手册.pdf

    - **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例**:提供了一个Gen_Fsm行为的实例。 - **2.3.3 启动一个Gen_Fsm**:如何启动一个有限状态机。 - **2.3.4 事情通知**:事件被...

    Erlang OTP设计原理文档 中文版本

    5. Gen_FSM(Finite State Machines): `gen_fsm.html`涵盖了生成有限状态机的行为,它允许开发人员创建具有多个状态和转换规则的进程。这种行为模式适用于处理事件驱动的、有明确状态变化的应用。 6. Gen_Event...

    Erlang-game-server开发实践.pdf

    * 游戏逻辑层:使用Erlang的Actor模型和gen_fsm行为树来实现游戏逻辑。 * 网络层:使用Ranch和Cowboy框架来实现网络层,处理客户端的连接和通信。 * 数据库层:使用Erlang的ETS、Mnesia、MySQL、MongoDB等数据库来...

    OTP Design Principles

    - **通知事件**:通过`gen_fsm:send_event/2`函数发送事件。 - **超时**:可以通过设置定时器来触发状态转换。 - **所有状态事件**:某些事件可以在任何状态下被处理。 - **停止**:使用`gen_fsm:stop/1`函数停止。 ...

    Erlang OTP并发编程实战(中文版)

    OTP还提供了如GenServer、GenEvent、Gen_fsm等预定义的行为,它们为常见的并发模式提供了标准化的实现。 **GenServer** 行为是一种常用的服务器模式,它简化了状态管理和错误处理。GenServer提供了异步调用、同步...

    erlang server源码

    Erlang提供了一些预定义的行为模式,如gen_server、gen_event和gen_fsm等,它们为实现特定类型的服务提供了模板。echatServer可能使用gen_server行为来实现服务器的核心逻辑,包括用户注册、登录、发送和接收消息等...

    LAB_6v1_pulse_vhdl_gen_源码

    "LAB_6v1_pulse_vhdl_gen_源码" 提供的是一个使用VHDL编写的脉冲发生器的源代码。脉冲发生器在数字电路中扮演着重要角色,它能够产生具有特定时序和特性的脉冲信号,这些信号在各种应用场景中,如计时、触发、同步等...

    otp_src_21.1.tar.gz

    1. **模块化设计**:OTP提供了各种预定义的进程行为模式(gen_server、gen_event、gen_fsm等),便于开发者创建符合特定模式的进程,提高了代码复用和可维护性。 2. **分布式计算**:Erlang OTP支持跨节点的进程...

    otp_src_22.0_h.tar.gz

    OTP提供了几个设计良好的应用框架,如gen_server、gen_event、gen_fsm等,它们是基于行为模式的模块,简化了并发编程和状态管理。 5. **分布式功能** OTP支持跨节点的分布式计算,使得在多台机器上构建分布式系统...

    前端项目-machina.js.zip

    这个库的主要目的是提供一种工具,帮助开发者构建复杂而灵活的状态管理机制,它受到了Erlang/OTP中的gen_fsm行为的启发。在Erlang中,gen_fsm是一种通用状态机行为,用于处理具有多个状态和状态转换的并发系统。 **...

    erlang_otp_src_17.3.tar.gz

    7. **行为模块**:如gen_server、gen_event、gen_fsm等,是OTP设计模式的具体实现,简化了编写服务器、事件处理器和有限状态机的代码。 关于压缩包内的"otp_src_17.3",这是Erlang OTP 17.3版本的源代码目录。为了...

Global site tag (gtag.js) - Google Analytics