网上搜索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},).

一般采用第一个异步处理

异步的回调函数声明,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}, };
Incomplete when length(Incomplete)<length(UnlockCode) ->
{next_state, locked, {Digit, UnlockCode}, };
Wrong -> delay:delay(),
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}, };
Incomplete when length(Incomplete)<length(UnlockCode) ->
{next_state, locked, {Digit, UnlockCode}, };
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吧

最新文章

  1. 怎样给div增加resize事件
  2. MySQL:procedure, function, cursor,handler
  3. Java基础--serialVersionUID
  4. SQLSTATE[HY000] [2003] Cant connect to MySQL server
  5. domion Designer 管理员ID过期
  6. PacBio软件总览 - 初级分析
  7. Linux下的TUN/TAP编程
  8. 出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
  9. BZOJ 2763: [JLOI2011]飞行路线 最短路
  10. 【译】在JavaScript中{}+{}的结果是什么?
  11. JQuery focus()
  12. js中的null与undefined
  13. jquery图片播放插件Fancybox(灯箱)
  14. mysql 获取全局唯一值
  15. iOS中解析json多种方法
  16. JavaScript 使用闭包防止变量污染
  17. salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)
  18. Swift基础之显示波纹样式
  19. PAT1130:Infix Expression
  20. zzw原创_linux下的ping6用法

热门文章

  1. Object有哪些方法?
  2. HTML5 canvas之基础篇(一)
  3. python学习笔记(time.time方法)
  4. sass基础篇
  5. 更新增加一个门店ID字段的值
  6. 数据库设计系列之四--ER图
  7. 交叉编译工具链介绍《Building Embedded Linux Systems》
  8. SpringCloud 教程 | 第十四篇: 服务注册(consul)
  9. 《修炼Java开发技术 在架构中体验设计模式和算法之美》 - 书摘精要
  10. 剑指offer--23.合并两个排序的链表