2011-01-27 66 views
1

我嘗試在erlang中編寫簡單的gen_event applcation。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

如果您只是編譯該源代碼,編譯器會非常尖銳地指出錯誤: 「./test.erl:30:警告:此子句無法匹配,因爲第28行的前一個子句總是匹配」 – 2011-01-27 22:14:41

回答

1

除了交換條款作爲@E多米尼克提到你是否真的使用test:add_handler()增加了一個處理程序?電話test:start_link()只是啓動事件管理器,您需要通過添加處理程序來告訴它該怎麼做。即使處理程序代碼與管理器在同一個模塊中。即使alarm_handler這是sasl的一部分,這通常不是好的做法。

這樣做時,您的代碼在寫入​​時會發生事件。