步骤:(创建,添加,发送)
- 启动/注册一个或多个事件管理器进程,比如A, B, C
- 往某个事件管理器中添加自定义的处理模块,比如往A中添加自定义处理模块myHandler
- 向某个事件管理器发送事件,比如向A中发送事件
(1)注册一个事件管理器进程,名字为event (在shell中执行,方法4选1)
%%当事件管理器是监控树的一部分,则要必须用start_link
%%start_link() -> {ok, Pid} | {error, {already_started, Pid}}
gen_event:start_link().
gen_event:start_link({local, event}).
%%独立使用,可直接用start
%%start() -> {ok, Pid} | {error, {already_started, Pid}}
gen_event:start().
gen_event:start_link({local, event}).
(2)向事件管理器event中添加自定义处理模块myHandler
-module(myHandler).
-behaviour(gen_event).
-compile(export_all).
%%初始化
init([]) ->
{ok, []}.
%%处理notify或sync_notify方式发过来的事件
handle_event(Event, State) ->
io:format("notify event is: ~p~n",[Event]),
{ok, State}.
%%处理call方式发过来的事件
handle_call(Request, State) ->
Reply = ok,
io:format("call event is: ~p~n",[Request]),
{ok, Reply, State}.
%%Info是接受到的事件信息
handle_info(Info, State) ->
io:format("info is: ~p~n",[Info]),
{ok, State}.
%%每当事件管理器delete自定义处理模块时调用
terminate(Reason, State) ->
io:format("a handle module has been deleted"),
ok.
%%当前状态State发生改变时调用
code_change(OldVsn, State, Extra) ->
{ok, State}.
- 将自定义模块myHandler添加到事件管理器event中(shell中执行)
%%add_handler(事件管理器名字, 自定义处理模块名字, 自定义模块初始化传入参数)
%%add_handler -> ok | {'EXIT', Reason} | term()
gen_event:add_handler(event, myHandler, []).
(3)往事件管理器event中发送一个事件(shell中执行,方法4选1)
%%异步发送,不用等待返回结果,->ok
gen_event:notify(event, "hello world").
%%同步发送,会阻塞等待返回结果,->ok
gen_event:sync_notify(event, "hello world").
%%同步发送,会阻塞等待返回结果, -> Reply | {error, Error}
gen_event:call(event, "hello world").
%%同步发送,会阻塞,超过5秒后返回失败, -> Reply | {error, Error}
gen_event:call(event, "hello world", 5000).