Timer 如何在Erlang中定期打印值
我只是想让这个Erlang程序周期性地打印出一个值,我使用这个模块来实现这一点:Timer 如何在Erlang中定期打印值,timer,erlang,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) ->
-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.
我引用了来自
我还尝试使用顶部答案的修改,如下所示:
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}.
-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.
在这两种情况下都不会打印出来。它只是告诉我一些类似{好吧,}的事情。似乎根本不会调用handle_info。显示每秒的值,例如,如下所示:
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}.
-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.
有关此函数及其参数的信息,请阅读。这种方法不仅仅是使用定时器模块。显示每秒的值,例如,如下所示:
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}.
-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.
有关此函数及其参数的信息,请阅读。这种方法不仅仅是使用定时器模块。当然。如果您写下您正在做的事情(哪些函数调用)以及您希望在显示器上看到的内容,则会更好。erlang:display(0)。只显示0。在这一点上,它并不重要,它只是一个实验。我只是调用init()或start()。您误解了我,我想知道您希望得到什么结果。handle_info-用于处理gen_服务器OTP中的自发消息。你必须处理从计时器收到的信息。我是全新的Erlang,我一定不明白这里发生了什么。最终,我想要的是每秒在屏幕上打印一个值。也许这是完全错误的方法?消息本身并不是我真正关心的东西,它始终是同一条消息——在屏幕上显示一个值。我只是不太懂英语,所以我想在回答问题之前确保正确理解问题。当然。如果您写下您正在做的事情(哪些函数调用)以及您希望在显示器上看到的内容,则会更好。erlang:display(0)。只显示0。在这一点上,它并不重要,它只是一个实验。我只是调用init()或start()。您误解了我,我想知道您希望得到什么结果。handle_info-用于处理gen_服务器OTP中的自发消息。你必须处理从计时器收到的信息。我是全新的Erlang,我一定不明白这里发生了什么。最终,我想要的是每秒在屏幕上打印一个值。也许这是完全错误的方法?消息本身并不是我真正关心的东西,它始终是同一条消息——在屏幕上显示一个值。我只是不太懂英语,所以我想在回答问题之前确保正确理解问题。