メモ6-gen_event

1735 ワード

-module(testevent).
-behaviour(gen_event).

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

-record(state, {}).

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

handle_event(Event, State) ->
    {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}.

実装を見てみると、気づいたか、genとserverは似ていますが、木がありますか?
両者にはいったいどんな違いがあるのだろうか.まずインタフェース関数を見てみましょう.まず、区別してからにしましょう.
init/1:関数startまたはstart_link呼び出し後、この関数を自分でコールバックします.ここでstart_link起動には一定のこだわりがある.startをいつ使うかstart_をいつ使うかlink? handle_event/2:gen_event:notify駆動handle_call/2:gen_event:callドライバhandle_info/2:このシステムの内部のメッセージは駆動して、あるいはメッセージは来て、例えばsend!.やはりterminate/2に深く入り込む必要があります:プロセスが終了すると駆動します.code_change/3:コードの熱更新時に駆動する.handle_event/2とhandle_call/2の違いは何ですか.はい、最初の関数には私たちが必要とする戻り値がありません.2番目は戻り値があります.
ではgen_イベントとgenserverはいったいどんな違いがありますか:gen_eventは動的に削除イベントを追加することができ、使いやすく、実用的に見えるが、実際にはこれを使うことは少ない(otpソースコードを見てこれを使うことは少ない).
では、削除イベントを追加するにはどうすればいいですか.以下の関数を見てわかります.
gen_event:start(Handler) -> {ok, Pid} | {error, What}
    gen_event:add_handler(Handler, Mod, Args) -> ok | Other
        gen_event:notify(Handler, Event) -> ok
        gen_event:call(Handler, Mod, Query) -> {ok, Val} | {error, Why}
        gen_event:call(Handler, Mod, Query, Timeout) -> {ok, Val} | {error, Why}
    gen_event:delete_handler(Handler, Mod, Args) -> Val
    gen_event:swap_handler(Handler, {OldMod, Args1}, {NewMod, Args2}) -> ok
    gen_event:which_handler(Handler) -> [Mod]
gen_event:stop(Handler) -> ok