我尝试在erlang中编写简单的gen_event applcation。
我的代码:
-module(test).
-behavior(gen_event).
-export([notify/0]).
%% API
-export([start_link/0, add_handler/0, stop/0]).
%% gen_event callbacks
-export([init/1, handle_event/2, handle_call/2,
handle_info/2, terminate/2, code_change/3]).
-define(SERVER, ?MODULE).
start_link() ->
gen_event:start_link({local, ?SERVER}).
add_handler() ->
gen_event:add_handler(?SERVER, ?MODULE, []).
stop() ->
gen_event:stop(?MODULE).
init([]) ->
%add_handler(),
{ok, null}.
handle_event(_Event, State) ->
{ok, State};
handle_event({test}, State) ->
io:format("Test"),
{ok, State}.
handle_call(_Request, State) ->
Reply = ok,
{ok, Reply, State}.
handle_info(_Info, State) ->
{ok, State}.
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
notify() ->
gen_event:notify(?SERVER, {test}).
当我尝试通知时,我希望函数handle_event({test},State)执行但不会发生任何事情。为什么?怎么了?
我在哪里可以看到gen_event的简单例子?
谢谢。
答案 0 :(得分:2)
好吧,你已经改变了你的handle_event子句。第一个将始终匹配,因此您将无法访问{test}子句。
据我所知,最好的在线文档是http://www.erlang.org/doc/design_principles/events.html。但我可以推荐,例如Erlang和OTP正在行动http://www.amazon.com/Erlang-OTP-Action-Martin-Logan/dp/1933988789
答案 1 :(得分:1)
除了交换@E Dominique提到的条款你是否真的使用test:add_handler()
添加了一个处理程序?调用test:start_link()
只是启动事件管理器,您需要通过添加处理程序告诉它该做什么。即使处理程序代码与管理器位于同一模块中也是如此。即使属于alarm_handler
的{{1}}执行此操作,这通常也不是一种好习惯。
执行此操作时,您的代码会在收到事件时编写sasl
。