Erlang gen_event не работает
Я пытаюсь написать простое приложение gen_event на эрланге.
Мой код:
-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?
Спасибо.
2 ответа
Ну, вы отменили свои предложения handle_event. Первый всегда будет совпадать, поэтому вы не достигнете условия {test}.
Насколько я знаю, лучшая онлайн-документация - это http://www.erlang.org/doc/design_principles/events.html. Но я могу порекомендовать, например, книгу "Эрланг и ОТП в действии" http://www.amazon.com/Erlang-OTP-Action-Martin-Logan/dp/1933988789
Помимо обмена предложениями, о которых упоминал @E Dominique, вы действительно добавили обработчик, использующий test:add_handler()
? Вызов test:start_link()
просто запускает менеджер событий, вам нужно сказать ему, что делать, добавив обработчики. Это даже если код обработчика находится в том же модуле, что и менеджер. Как правило, это не очень хорошая практика, даже если alarm_handler
которая является частью sasl
Является ли это.
Делая это, ваш код работает написание "Test"
когда он получает событие.