我基本上遵循本網站上的教程Learn you some Erlang:Designing a concurrent application,我試圖用下列命令運行下面的代碼,並在第48行出現錯誤。我確實關閉了防火牆,以防萬一問題,但沒有運氣。我在Windows XP SP3上。Erlang進程事件錯誤
9> c(事件)。
{ok,event}
10> f()。
ok
11> event:start(「Event」,0)。
=錯誤報告==== 9-FEB-2013 :: 15:05:07 === 錯誤在過程< 0.61.0>與出口值:{function_clause,[{事件,time_to_go,[0 ],[{file,「event.erl」},{line,48}]},{event,init,3,[{file,「event.erl」},{line,31}]}]}
< 0.61.0>
12>
-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 the process is already 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 a list for times in order to go around the ~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={{_,_,_}, {_,_,_}}) ->
Now = 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 is limited to about 49 days (49*24*60*60*1000) in
%% milliseconds, the following function is used
normalize(N) ->
Limit = 49*24*60*60,
[N rem Limit | lists:duplicate(N div Limit, Limit)].
這是我的想法(我通過的論點是錯誤的),但我盲目地遵循網站上的教程,如果你看,你會發現他沒有得到任何錯誤運行它?感謝它現在的作品! – pandoragami 2013-02-10 06:54:00
@lost_with_coding我檢查了這本書,對我來說,看起來'0'的調用是第一個版本,其中時間是秒(?)。據我所知,他沒有舉出第二版日期/時間元組的例子。他應該有的。如果我正確閱讀它。 – rvirding 2013-02-12 01:30:16