gen_fsm的学习笔记

网上搜索gen_fsm的例子,90%都是code_lock,依葫芦画瓢弄了下,记录一些学习心得

 

init(UnLockCode) ->
    process_flag(trap_exit,true),

    io:format("init: ~p~n", [UnLockCode]),
    {ok, locked, {[], UnLockCode}}.

init返回值里面,locked为StateName,{[], UnLockCode}为StateData,在回调函数里面有用

 

发送event有两种方式

gen_fsm:send_event(code_lock, {button, Digit}).
gen_fsm:sync_send_event(code_lock, {button, Digit},100000).

一般采用第一个异步处理

 

异步的回调函数声明,StateName( Event, StateData)

locked({button, Digit}, {SoFar, UnlockCode}) ->
    io:format("async buttion: ~p, So far: ~p, Code: ~p~n", [Digit, SoFar, UnlockCode]),
    InputDigits = lists:append(SoFar, Digit),
    case InputDigits of
        UnlockCode ->
            do_unlock(),
            {next_state, open, {[], UnlockCode}, 10000};
        Incomplete when length(Incomplete)<length(UnlockCode) ->
            {next_state, locked, {Digit, UnlockCode}, 5000};
        Wrong ->

            delay:delay(10000000000),
            io:format("wrong passwd: ~p~n", [Wrong]),
            {next_state, locked, {[], UnlockCode}}
    end;

 

同步的回调函数声明,StateName( Event, From,StateData)

locked({button, Digit}, _From,{SoFar, UnlockCode}) ->
    io:format("sync buttion: ~p, So far: ~p, Code: ~p~n", [Digit, SoFar, UnlockCode]),
    InputDigits = lists:append(SoFar, Digit),
    case InputDigits of
        UnlockCode ->
            do_unlock(),
            {next_state, open, {[], UnlockCode}, 10000};
        Incomplete when length(Incomplete)<length(UnlockCode) ->
            {next_state, locked, {Digit, UnlockCode}, 5000};
        Wrong ->
            io:format("wrong passwd: ~p~n", [Wrong]),
            {next_state, locked, {[], UnlockCode}}
    end;

 

另,erl终端测试给gen_fsm:start_link出来的Pid发exit消息,handle_info收不到,取消link以后收到,处理大概如下

handle_info({'EXIT',Pid,Reason}, StateName, Data) ->
    io:format("exit ~n"),
    {stop, StateName, Data};

 

目前看起来进程池部分,用gen_server作为worker比用gen_fsm要简单点,那就gen_server吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值