Process Erlang进程事件错误

Process Erlang进程事件错误,process,erlang,Process,Erlang,我基本上是按照这个网站上的教程来做的,我试着用下面的命令运行下面的代码,但在第48行出现了一个错误。我确实关闭了防火墙以防出现问题,但运气不好。我使用的是WindowsXPSP3 9> c(活动) {好的,事件} 10> f() 嗯 11> 事件:开始(“事件”,0) =错误报告===2013年2月9日::15:05:07=== 使用退出值进行处理时出错:{function_子句,[{event,time_to_go,[0],{file,“event.erl”},{line,48}]},{eve

我基本上是按照这个网站上的教程来做的,我试着用下面的命令运行下面的代码,但在第48行出现了一个错误。我确实关闭了防火墙以防出现问题,但运气不好。我使用的是WindowsXPSP3

9> c(活动)

{好的,事件}

10> f()

11> 事件:开始(“事件”,0)

=错误报告===2013年2月9日::15:05:07=== 使用退出值进行处理时出错:{function_子句,[{event,time_to_go,[0],{file,“event.erl”},{line,48}]},{event,init,3,[{file,“event.erl”},{line,31}]}

12>

-模块(事件)。
-导出([开始/2,开始链接/2,取消/1])。
-导出([init/3,loop/1])。
-记录(状态,{server,
name=“”,
to_go=0})。
%%%公共接口
开始(事件名称、日期时间)->
spawn(?MODULE,init,[self(),EventName,DateTime])。
开始链接(事件名称、日期时间)->
生成链接(?MODULE,init,[self(),EventName,DateTime])。
取消(Pid)->
%%监视进程是否已停止
Ref=erlang:monitor(进程,Pid),
Pid!{self(),Ref,cancel},
接收
{Ref,ok}->
erlang:demonitor(参考[flush]),
好啊
{'DOWN',Ref,process,Pid,_Reason}->
好啊
终止
%%%事件内部
init(服务器、事件名、日期时间)->
循环(#state{server=server,
name=EventName,
to_go=time_to_go(日期时间)})。
%%循环使用时间列表,以绕过~49天的限制
%%暂停。
循环(S=#state{server=server,to|go=[T|Next]})->
接收
{Server,Ref,cancel}->
服务器{Ref,ok}
T*1000->
如果下一步=:=[]->
服务器{done,S#state.name};
下一步=/=[]->
循环(状态{to#u go=Next})
终止
终止
%%%私人职能
开始的时间(超时={{{{{},{{{},{{{},})->
现在=日历:本地时间(),
多哥=日历:日期时间到公历秒(超时)-
日历:日期时间到公历秒(现在),
秒=如果多哥>0->多哥;
多哥=<0->0
终止
正常化(秒)。
%%因为Erlang的存储时间限制为49天(49*24*60*60*1000)
%%毫秒,使用以下函数
正常化(N)->
极限=49*24*60*60,
[N rem限制|列表:重复(N div限制,限制)]。

它完全在您的计算机上本地运行,因此防火墙不会影响它

问题是启动时给出的第二个参数
event:start(“event”,0)。

错误原因:

{function_clause,[{event,time_to_go,[0],[{file,"event.erl"},{line,48}]},{event,init,3,[{file,"event.erl"},{line,31}]}]}
表示这是一个
function\u子句
错误,这意味着函数定义中没有与参数匹配的子句。它还告诉您,第48行上的函数
事件:time\u to\u go/1
失败了,它是用参数
0
调用的

如果您查看函数
time\u to\u go/
,您将看到它的参数是由2个元素组成的元组,其中每个元素是由3个元素组成的元组:

time_to_go(TimeOut={{_,_,_}, {_,_,_}}) ->
这个参数的结构是
{Year,Month,Day},{Hour,Minute,Second}
。如果您向后跟随此参数,则会从
init/3
调用
time\u to\u go/
,其中
time\u to\u go/1
DateTime
,是
init/3
的第三个参数。现在差不多了。现在,
init/3
是进程在
start/2
(和start\u link/2
)中产生的函数,
init/3
的第三个参数是
start/2>的第二个参数


因此,当您调用
event:start(“event”,0)时。
这里的
0
被传递到新peaccess中的调用
time\u to\u go/1
函数中。而且格式是错误的。您应该使用类似于
event:start(“event”{2013,3,24},{17,53,62}})的方法调用它。

它完全在您的机器上本地运行,所以防火墙不会影响它

问题是启动时给出的第二个参数
event:start(“event”,0)。

错误原因:

{function_clause,[{event,time_to_go,[0],[{file,"event.erl"},{line,48}]},{event,init,3,[{file,"event.erl"},{line,31}]}]}
表示这是一个
function\u子句
错误,这意味着函数定义中没有与参数匹配的子句。它还告诉您,第48行上的函数
事件:time\u to\u go/1
失败了,它是用参数
0
调用的

如果您查看函数
time\u to\u go/
,您将看到它的参数是由2个元素组成的元组,其中每个元素是由3个元素组成的元组:

time_to_go(TimeOut={{_,_,_}, {_,_,_}}) ->
这个参数的结构是
{Year,Month,Day},{Hour,Minute,Second}
。如果您向后跟随此参数,则会从
init/3
调用
time\u to\u go/
,其中
time\u to\u go/1
DateTime
,是
init/3
的第三个参数。现在差不多了。现在,
init/3
是进程在
start/2
(和start\u link/2
)中产生的函数,
init/3
的第三个参数是
start/2>的第二个参数


因此,当您调用
event:start(“event”,0)时。
这里的
0
被传递到新peaccess中的调用
time\u to\u go/1
函数中。而且格式是错误的。您应该使用类似于
event:start(“event”{2013,3,24},{17,53,62}})的内容来调用它。

要为rvirding的答案添加背景,您会得到错误,因为 该示例一直工作到最后一段代码为止 我知道。首先使用
normalize
函数,该函数处理 问题然后在问题中的例子后面的段落 上面的文字说:

而且它有效!事件模块最讨厌的一件事是我们 必须以秒为单位输入剩余时间。如果我们 可以使用标准格式,如Erlang的datetime(
{{Year,Month,
日},{小时,密歇根州