[erlang-questions] Erlang timer program - feedback please
Bengt Kleberg
bengt.kleberg@REDACTED
Mon Oct 6 11:20:46 CEST 2008
Greetings,
If you want to call/send at a regular interval you might want to use
timer:apply_interval/4 or timer:send_interval/2 in
http://erlang.org/doc/man/timer.html
bengt
On Fri, 2008-10-03 at 11:52 -0700, Sean Payne wrote:
> I am hoping someone with more Erlang experience than me could give me
> some feedback on the timer code below.
>
> I am using erlang:start_timer and tail recursion with a paused state
> and a running state to create a little simulation
> * world:init(). inits the sim
> * world:run(). starts the updates (right now updates just print out
> "updating")
> * world:pause(). pauses the updates
> * world:destroy(). shuts it down
>
> So my questions are:
> 1) Is there a better way (timer wise) to do this. I suspect that the
> way I am using the timer that my update_now will not be called at the
> right frequency because of the delay between when the event fires and
> when the next event is scheduled.
>
> 2) Is there a better way Erlang wise to do something like this. I am
> new to Erlang, so I am curious if this is the approach that someone
> with more experience would take. Is this how you would write
> this?????
>
> 3) Are there any bugs or leaks? ie am I using Tail recursion
> correctly? (every time I pause or unpause the program, am I going
> deeper into the stack?)
>
> Thanks,
>
> Sean
>
> =========================================
> -module(world).
>
> %% External interfaces
> %% world:init sets up the world (into the paused state)
> %% world:run starts the timers and updates every UPDATE_INTERVAL
> %% world:stop pauses the world
> %% world:destroy destroys the world
> -export([init/0]).
> -export([run/0]).
> -export([stop/0]).
> -export([destroy/0]).
>
> %% internal functions but must be exported to receive events from
> erlang:start_timer
> -export([handle_events_while_stopped/0]).
> -export([handle_events_while_running/0]).
>
> -define(UPDATE_INTERVAL,1000).
>
> handle_events_while_stopped() ->
> receive
> finished->
> io:format("world is finished~n", []);
> run->
> io:format("world is running~n", []),
> erlang:start_timer(?UPDATE_INTERVAL, self(), update_now),
> handle_events_while_running()
> end.
>
> handle_events_while_running() ->
> receive
> finished->
> io:format("world is finished~n", []);
> stop->
> io:format("world is stopping~n", []),
> handle_events_while_stopped();
> {timeout, _ , update_now} ->
> io:format("updating~n", []),
> erlang:start_timer(?UPDATE_INTERVAL, self(), update_now),
> handle_events_while_running()
> end.
>
>
> init() ->
> register(world, spawn(world, handle_events_while_stopped,[])).
>
> run()->
> world ! run.
>
> stop()->
> world ! stop.
>
> destroy()->
> world ! finished.
>
>
>
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
More information about the erlang-questions
mailing list