1

単純な gen_event アプリケーションを erlang で作成しようとしています。

私のコード:

-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の簡単な例はどこで見ることができますか?

ありがとうございました。

4

2 に答える 2

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

于 2011-01-27T18:13:41.787 に答える
1

@E Dominiqueが言及したように句を交換することとは別に、実際に使用してハンドラーを追加しましたtest:add_handler()か? 呼び出しtest:start_link()はイベント マネージャーを開始するだけです。ハンドラーを追加して何をすべきかを伝える必要があります。これは、ハンドラー コードがマネージャーと同じモジュールにある場合でも発生します。alarm_handlerこれは、これが一部であっても、一般的には良い習慣ではありsaslません。

これを行うと、イベントを受け取ったときにコードを書き込めるようになります"Test"

于 2011-01-28T13:11:06.353 に答える