2011-01-27 68 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的一部分,这通常不是好的做法。

这样做时,您的代码在写入​​时会发生事件。