如何在Erlang中定期执行操作

voase2hg  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(257)
-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)中?

cnh2zyt3

cnh2zyt31#

在timer模块中,函数apply_interval(Time, Module, Function, Arguments)每隔Time执行一次Module:Function(Arguments)。它负责生成一个进程,返回一个引用以允许稍后取消。
您还可以在同一个库中查看send_interval(Time, Pid, Message)
您还可以实现一个简单的循环,如下所示:

loop(Args,Tick) when is_integer(Tick), Tick >= 0 ->
    receive
        stop -> stopped
    after 
        Tick ->
            do_something(Args),
            {NewArgs,NewTick} = new_args(Args,Tick), 
            loop(NewArgs,NewTick)
    end.

它不是一个实时计时器,但是函数new_args(Args,Tick)可以帮助纠正由于进程调度引起的偏差。

oo7oh9g9

oo7oh9g92#

我觉得你需要这样的东西:

start_timer() ->
    gen_server:start_link({local, clock}, ?MODULE, [], []).

相关问题