如何在Erlang中定期打印出一个值

时间:2016-04-17 22:35:11

标签: timer erlang

我试图让这个Erlang程序定期打印出一个值,并且我使用这个模块来执行此操作:

   -module(hot).
   -export([start/0,handle_info/2,  add/1]).

   start() ->
           Num = 0,
           timer:send_interval(1000, interval),
           {ok, Num}.

   handle_info(interval, Num) ->
          erlang:display(0),
          {noreply, Num}.

   add(X) ->
          X+2.

我引用了this post

中的一个答案

我也尝试使用顶部答案的修改如下:

init([]) ->
  Timer = erlang:send_after(1, self(), check),
  {ok, Timer}.

handle_info(check, OldTimer) ->
  erlang:cancel_timer(OldTimer),
  erlang:display(0),
  Timer = erlang:send_after(1000, self(), check),
  {noreply, Timer}.

在任何一种情况下都没有打印出来。它只是告诉我{ok,< 0.43.0>}之类的东西。似乎根本就没有调用handle_info。

1 个答案:

答案 0 :(得分:4)

显示每秒的值,例如,如下所示:

-module(test).
-export([start/1]).

start(Num) when not is_number(Num)-> {error,not_a_number};
start(Num)->spawn(fun()->print(Num) end).

print(Num)->
    erlang:start_timer(1000, self(), []),
    receive
          {timeout, Tref, _} ->
            erlang:cancel_timer(Tref),
            io:format("~p~n",[Num]),
            if
                Num =:=0 -> io:format("Stop~n");
                true -> print(Num-1)
            end
    end.

有关此功能及其参数的信息,您可以阅读documentation。这种方法比使用计时器模块更effecient