1

我尝试用 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({test}, State) 执行但没有任何反应。为什么?怎么了?

我在哪里可以看到 gen_event 的简单示例?

谢谢你。

4

2 回答 2

2

好吧,您已经颠倒了您的 handle_event 子句。第一个将始终匹配,因此您不会到达 {test} 子句。

据我所知,最好的在线文档是http://www.erlang.org/doc/design_principles/events.html。但我可以推荐例如《Erlang and OTP in action》这本书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 回答