1.简介

如果回调函数失败或返回坏的值,gen_fsm将会终止。

2.函数

2.1导出函数
用于创建一个gen_fsm进程,可以作为监控树的一部分。可以被监控树直接或间接的调用,将确保gen_fsm被链接到监控树。gen_fsm进程调用Module:init/1来初始化。为了确保同步的启动gen_fsm,start_link/3,4直到Module:init/1返回时才返回。
如果FsmName = {local,Name},gen_fsm在本地通过register/2注册为Name.如果FsmName = {global, GlobalName},gen_fsm在全局通过global:register_name/2注册为GlobalName.如果FsmNam = {via, Module, ViaName},gen_fsm通过Module注册为ViaName,同时回调模块Module将导出函数register_name/2, unregister_name/2, whereis_name/1和send/2,其原理同global,因此{via, Module, GlobalName}是一个有效的引用。
如果没有指定name,gen_fsm不被注册。
Args是一个任意的项式,用于作为Module:init/1的参数。
如果option是{timeout, Time}那么gen_fsm有Time毫秒进行初始化,否则,将返回{error, timeout}来终止。
如果option是{debug, Dbgs}那么Dbgs中相应的sys函数将被调用。详情见sys(3).
如果option是{spawn_opt, Sopts}那么通过指定的值列表来产生gen_fsm进程。详见erlang:spawn_opt
start(Module, Args, Options) -> Result
start(FsmName, Module, Args, Options) -> Result
send_event(FsmRef, Event) -> ok
FsmRef = Name | {Name,Node} | {global,GlobalName} | {via,Module,ViaName} | pid()
向gen_fsm的FsmRef发送一个异步事件,并立即返回ok.gen_fsm将调用Module:StateName/2来处理事件,StateName为当前gen_fsm的状态。
FsmRef可能是:
Event是一个任意的项式,将被作为参数传递给Module:StateName/2处理。
2.2回调函数

3.实践

3.1 启动一个gen_fsm
3.2 发送一个事件
3.3 发送一个所有状态都能接受的事件
3.4 开启一个定时器
3.5 将普通进程转变为gen_fsm进程

4.总结

 
 
优秀的代码是艺术品,它需要精雕细琢!
03-31 11:38
查看更多