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}]},{event,init,3,[{file,“event.erl”},{line,31}]} 12>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
-模块(事件)。
-导出([开始/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,
日},{小时,密歇根州