-define(INTERVAL, 1000).
init([]) ->
Timer = erlang:send_after(?INTERVAL, self(), tick),
{ok, Timer}.
handle_info(tick, OldTimer) ->
erlang:cancel_timer(OldTimer),
io:format("Tick ~w~n", [OldTimer]),
Timer = erlang:send_after(?INTERVAL, self(), tick).
{noreplay, Timer}.
start_clock() ->
{_, Timer} = init([]),
spawn(clock, handle_info, [tick, Timer]).
我的代码如上所述,但输出不是我想要的。我如何将init()和handle_info()集成到主函数(start_clock)中?
2条答案
按热度按时间cnh2zyt31#
在timer模块中,函数
apply_interval(Time, Module, Function, Arguments)
每隔Time执行一次Module:Function(Arguments)。它负责生成一个进程,返回一个引用以允许稍后取消。您还可以在同一个库中查看
send_interval(Time, Pid, Message)
。您还可以实现一个简单的循环,如下所示:
它不是一个实时计时器,但是函数new_args(Args,Tick)可以帮助纠正由于进程调度引起的偏差。
oo7oh9g92#
我觉得你需要这样的东西: