我想在特定的时间间隔内执行一个函数,我的意思是:
action()->
...
...
move(2) for 3 sec. %hypothetical example where it's executed each sec.
我以为我可以这样做:
action() ->
...
...
move(2),
sleep(1),
move(2),
sleep(1),
move(2).
但是,我想知道是否有其他方法可以实现它,因为我查看了计时器模块,但我找不到任何可以使用的方法。
谢谢!
答案 0 :(得分:1)
递归是您正在寻找的
快速回答您的问题:
action(0)->
done;
action(Count)->
io:format("moved"),
sleep(1000),
action(Count - 1).
做一些有用的事情:
action()->
Pid = spawn(fun()->start_moving(3) end),
sleep(10),
exit(Pid, terminate).
start_moving(0)->
done;
start_moving(Count)->
io:format("moved a little"),
sleep(1000),
start_moving(Count -1).
你需要根据你的应用程序进行改进,这里有一个你可以很好地控制你的间隔任务的例子:
action()->
Ref = make_ref(),
Count = 3,
Interval = 1000,
Pid = spawn(fun()->start_moving(Ref, Count, Interval) end),
%do lots of stuff
sleep(10000)
% stop moving
Pid ! {Ref, stop}.
start_moving(Ref, Interval, 0)->
done;
start_moving(Ref, Interval, Count)->
receive
{Ref, stop}->
ok;
_->
start_moving(Ref, Interval, Count)
after
Interval->
io:format("moving"),
start_moving(Ref, Interval, Count - 1)
end.
答案 1 :(得分:1)
如果不是睡觉,你只想继续调用函数直到时间过去,你可以使用这样的东西:
execute_while(Fun, N)->
execute_while(Fun, N, timer:tc(Fun)).
execute_while(Fun, N, {Time, _Value}) when N>=Time ->
{Time2, Value2} = timer:tc(Fun),
execute_while(Fun, N, {Time + Time2, Value2});
execute_while(_, _, R) ->
R.
这样称呼:
execute_while(fun()-> move() end, 1000).