gen_event handle_info не вызывается
Я использую поведение gen_event и помимо обработки событий я хочу иметь возможность обрабатывать другие общие сообщения. Согласно документации эти сообщения должны быть получены через handle_info. Тем не менее, это, кажется, не работает... если я не пропустил что-то очень очевидное
Вот моя реализация поведения:
-module(genevent).
-behaviour(gen_event).
-export([init/1, handle_event/2, handle_info/2, handle_call/2, terminate/2, start_link/0]).
init(_Args) -> {ok, []}.
handle_event(Event, State) ->
io:format("***Event*** ~p~n", [Event]),
{ok, State}.
handle_call(Call, State) ->
io:format("***Call*** ~p~n", [Call]),
{ok, State}.
handle_info(Info, State) ->
io:format("***Info*** ~p~n", [Info]),
{ok, State}.
start_link() -> gen_event:start_link({local, genevent}).
terminate(_Args, _State) -> ok.
И вот мое использование
{ok,PID} = genevent:start_link(),
io:format("***Sending to*** ~p~n", [PID]),
PID ! {hello},
io:format("***Sent hello to*** ~p~n", [PID]).
Проблема в том, что код io: format ("Info ~ p ~ n", [Info]) никогда не достигается.
Я надеюсь, что я не делаю что-то очень глупое! Спасибо
1 ответ
Решение
gen_event:start_link/1
просто запускает менеджер событий; он не добавляет ваш обработчик событий в этот новый менеджер событий. Вы должны сделать это самостоятельно с gen_event:add_handler/3
:
1> c(genevent).
genevent.erl:3: Warning: undefined callback function code_change/3 (behaviour 'gen_event')
{ok,genevent}
2> {ok,PID} = genevent:start_link().
{ok,<0.38.0>}
3> gen_event:add_handler(PID, genevent, {}).
ok
4> PID ! foo.
***Info*** foo
foo