erlang学习:用OTP构建系统1
书上案例学习并测试
23.1 通用事件处理
-module(event_handler).
%% API
-export([make/1, add_handler/2, event/2]).
%% 制作一个“什么都不干”的事件处理器Name(一个原子)。这样消息就有地方发送了。
make(Name) ->
register(Name, spawn(fun() -> my_handler(fun no_op/1) end)).
%% 给名为Name的事件处理器添加一个处理函数Fun。这样当事件X发生时,事件处理器就会执行Fun(X)。
add_handler(Name, Fun) -> Name ! {add, Fun}.
%% 发送消息X到名为Name的事件处理器。
event(Name, X) -> Name ! {event, X}.
my_handler(Fun) ->
receive
{add, Fun1} ->
my_handler(Fun1);
{event, Any} ->
(catch Fun(Any)),
my_handler(Fun)
end.
no_op(_) -> void.
运行结果
如果需要使用事件处理器进行事件处理,需要重新写一个事件处理器回调模块。
-module(motor_controller).
%% API
-export([add_event_handler/0]).
add_event_handler() ->
event_handler:add_handler(error, fun controller/1).
%%接收到的为too_hot则调用上方函数,否则调用下方
controller(too_hot) ->
io:format("Turn off the motor~n");
controller(X) ->
io:format("~w ignored event: ~p~n", [?MODULE, X]).
输出结果为