Saturday, 15 February 2014

erlang spawn process error? -



erlang spawn process error? -

i'm next this tutorial , tried compile event.erl , run according

6> c(event). {ok,event} 7> rr(event, state). [state] 8> spawn(event, loop, [#state{server=self(), name="test", to_go=5}]). <0.60.0> 9> flush(). ok 10> flush(). shell got {done,"test"} ok 11> pid = spawn(event, loop, [#state{server=self(), name="test", to_go=500}]). <0.64.0> 12> replyref = make_ref(). #ref<0.0.0.210> 13> pid ! {self(), replyref, cancel}. {<0.50.0>,#ref<0.0.0.210>,cancel} 14> flush(). shell got {#ref<0.0.0.210>,ok} ok

but cannot seem past step 8 because error instead.

7> spawn(event, loop, [#state{server=self(), name="test", to_go=5}]). =error report==== 14-feb-2013::11:14:38 === error in process <0.51.0> exit value: {function_clause,[{event,loop,[{state,<0.32.0>,"test",5}],[{file,"event.erl"},{line,35}]}]} <0.51.0>

the next event.erl

-module(event). -export([start/2, start_link/2, cancel/1]). -export([init/3, loop/1]). -record(state, {server, name="", to_go=0}). %%% public interface start(eventname, datetime) -> spawn(?module, init, [self(), eventname, datetime]). start_link(eventname, datetime) -> spawn_link(?module, init, [self(), eventname, datetime]). cancel(pid) -> %% monitor in case process dead ref = erlang:monitor(process, pid), pid ! {self(), ref, cancel}, receive {ref, ok} -> erlang:demonitor(ref, [flush]), ok; {'down', ref, process, pid, _reason} -> ok end. %%% event's innards init(server, eventname, datetime) -> loop(#state{server=server, name=eventname, to_go=time_to_go(datetime)}). %% loop uses list times in order go around ~49 days limit %% on timeouts. loop(s = #state{server=server, to_go=[t|next]}) -> receive {server, ref, cancel} -> server ! {ref, ok} after t*1000 -> if next =:= [] -> server ! {done, s#state.name}; next =/= [] -> loop(s#state{to_go=next}) end end. %%% private functions time_to_go(timeout={{_,_,_}, {_,_,_}}) -> = calendar:local_time(), togo = calendar:datetime_to_gregorian_seconds(timeout) - calendar:datetime_to_gregorian_seconds(now), secs = if togo > 0 -> togo; togo =< 0 -> 0 end, normalize(secs). %% because erlang limited 49 days (49*24*60*60*1000) in %% milliseconds, next function used normalize(n) -> limit = 49*24*60*60, [n rem limit | lists:duplicate(n div limit, limit)].

edit: tried alter function loop adding argument this

loop(s = #state{server=server, to_go=[t|next]}) -> loop(s = #state{server=server,name=eventname, to_go=[t|next]}) ->

and still compiles doesnt work, same error... thought maybe tuples didn't match. evolves downwards argument to_go=[t|next]} beingness incorrect.

it same problem in erlang process event error. start/2, start_link/2 , time_to_go/1 functions expects time argument of form {{year,month,day},{hour,minute,second}} why fail when phone call them 5. loop/1 function expects to_go field of #state{} list of integers interprets seconds , wait total time doing receive...after each one. goal of server able wait longer period of time erlang straight can in receive...after.

the time_to_go/1 function calculating number of seconds between , date/time entered argument , breaking downwards list of seconds of none greater maximum size receive...after can handle.

process erlang spawn

No comments:

Post a Comment