メモ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