我试图让这个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。
答案 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。