gen_fsm的学习笔记
2024-09-24 22:58:39
网上搜索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吧
最新文章
- 怎样给div增加resize事件
- MySQL:procedure, function, cursor,handler
- Java基础--serialVersionUID
- SQLSTATE[HY000] [2003] Cant connect to MySQL server
- domion Designer 管理员ID过期
- PacBio软件总览 - 初级分析
- Linux下的TUN/TAP编程
- 出现,视图必须派生自 WebViewPage 或 WebViewPage错误解决方法
- BZOJ 2763: [JLOI2011]飞行路线 最短路
- 【译】在JavaScript中{}+{}的结果是什么?
- JQuery focus()
- js中的null与undefined
- jquery图片播放插件Fancybox(灯箱)
- mysql 获取全局唯一值
- iOS中解析json多种方法
- JavaScript 使用闭包防止变量污染
- salesforce lightning零基础学习(三) 表达式的!(绑定表达式)与 #(非绑定表达式)
- Swift基础之显示波纹样式
- PAT1130:Infix Expression
- zzw原创_linux下的ping6用法