【问题标题】:How to print out a value periodically in Erlang如何在 Erlang 中定期打印出一个值
【发布时间】:2016-08-09 12:59:35
【问题描述】:

我试图简单地让这个 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,} 的信息。似乎根本没有调用handle_info。

【问题讨论】:

  • 当然。如果你写下你正在做什么(调用哪些函数)以及你希望在显示器上看到什么会更好。
  • erlang:display(0)。只显示0。此时它是什么并不重要,它只是一个实验。我只是调用 init() 或 start()。
  • 你误会了,我想知道你想得到什么结果。 handle_info - 用于处理 gen_server OTP 中的自发消息。您必须处理从计时器收到的消息。
  • 我是 Erlang 的新手,我一定不明白这里发生了什么。最终,我想要的只是每秒将一个值打印到屏幕上。也许这是完全错误的方法?消息本身并不是我真正关心的东西,它始终是相同的消息——在屏幕上显示一个值。
  • 我只是英语不好,所以我想确保在回答之前正确理解问题。

标签: timer erlang


【解决方案1】:

可以显示每一秒的值,例如如下:

-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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2023-01-01
    相关资源
    最近更新 更多