Erlang gen_event не работает - PullRequest
       23

Erlang gen_event не работает

1 голос
/ 27 января 2011

Я пытаюсь написать простое приложение 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 ]

2 голосов
/ 27 января 2011

Ну, вы отменили свои предложения handle_event. Первый всегда будет совпадать, поэтому вы не достигнете условия {test}.

Насколько я знаю, лучшая онлайн-документация - http://www.erlang.org/doc/design_principles/events.html. Но я могу порекомендовать, например. книга Эрланг и ОТП в действии http://www.amazon.com/Erlang-OTP-Action-Martin-Logan/dp/1933988789

1 голос
/ 28 января 2011

Помимо обмена предложениями, о которых упоминал @E Dominique, вы действительно добавили обработчик, использующий test:add_handler()?Вызов test:start_link() просто запускает менеджер событий, вам нужно сообщить ему, что делать, добавив обработчики.Это даже если код обработчика находится в том же модуле, что и менеджер.Как правило, это не очень хорошая практика, даже если alarm_handler, который является частью sasl, делает это.

При выполнении этого ваш код работает, записывая "Test" при получении события.

...