0
-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) に統合するにはどうすればよいですか?

4

2 に答える 2

2

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) を使用すると、プロセス スケジューリングによる偏差を修正できます。

于 2015-03-10T05:19:00.633 に答える