【Erlang】gen_event

步骤:(创建,添加,发送)

  1. 启动/注册一个或多个事件管理器进程,比如A, B, C
  2. 往某个事件管理器中添加自定义的处理模块,比如往A中添加自定义处理模块myHandler
  3. 向某个事件管理器发送事件,比如向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

  • 编写自定义处理模块myHandler.erl
-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).





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值