【问题标题】:gen_event handle_info not getting calledgen_event handle_info 没有被调用
【发布时间】:2012-10-31 01:38:38
【问题描述】:

我正在使用 gen_event 行为,除了处理事件之外,我还希望能够处理其他通用消息。根据文档,这些消息应该通过 handle_info 接收。但是,这似乎不起作用......除非我遗漏了一些非常明显的东西!

这是我的行为实现:

-module(genevent).

-behaviour(gen_event).

-export([init/1, handle_event/2, handle_info/2, handle_call/2, terminate/2, start_link/0]).

init(_Args) -> {ok, []}.

handle_event(Event, State) ->
    io:format("***Event*** ~p~n", [Event]),
    {ok, State}.

handle_call(Call, State) ->
    io:format("***Call*** ~p~n", [Call]),
    {ok, State}.

handle_info(Info, State) ->
    io:format("***Info*** ~p~n", [Info]),
    {ok, State}.

start_link() -> gen_event:start_link({local, genevent}).

terminate(_Args, _State) -> ok.

这是我的用法

{ok,PID} = genevent:start_link(),
io:format("***Sending to*** ~p~n", [PID]),
PID ! {hello},
io:format("***Sent hello to*** ~p~n", [PID]).

问题是代码 io:format("Info ~p~n", [Info]) 从未到达。

我希望我没有做一些非常愚蠢的事情! 谢谢

【问题讨论】:

    标签: erlang gen-event


    【解决方案1】:

    gen_event:start_link/1 只是启动一个事件管理器;它不会将您的事件处理程序添加到这个新的事件管理器中。您需要自己使用gen_event:add_handler/3

    1> c(genevent).
    genevent.erl:3: Warning: undefined callback function code_change/3 (behaviour 'gen_event')
    {ok,genevent}
    2> {ok,PID} = genevent:start_link().
    {ok,<0.38.0>}
    3> gen_event:add_handler(PID, genevent, {}).
    ok
    4> PID ! foo.
    ***Info*** foo
    foo
    

    【讨论】:

    • 感谢您的回答...我以为我必须只为事件添加处理程序
    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    相关资源
    最近更新 更多