2011-01-27 12 views
1

私は単純なgen_eventアプリケーションをerlangに書き込もうとしています。Erlang 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({テスト}、国家が)実行期待するが、何も発生しません。どうして?どうしましたか?

そして私はどこでgen_eventの簡単な例を見ることができますか?

ありがとうございます。

+0

コンパイラは、エラーを非常に鋭く指摘しています。 "警告:この句は、行28の前の節が常に" –

答えて

1

前述の@E Dominiqueと同じ句を入れ替えても、実際にはtest:add_handler()を使ってハンドラを追加しましたか? test:start_link()という呼出しでイベントマネージャが起動するだけで、ハンドラを追加することで何をすべきかを伝える必要があります。これは、ハンドラコードがマネージャと同じモジュール内にあっても同じです。これはsaslの一部であるalarm_handlerがこれをしても一般的には良くありません。

このコードを実行すると、イベントが発生すると​​と表示されます。

関連する問題