receive timeout
receive
Message1 [when Guard1] ->
Actions1 ;
Message2 [when Guard2] ->
Actions2 ;
...
after
TimeOutExpr ->
ActionsT
end
例:
-module(tt).
-export([start/0,value/1,loop/1,test/0]).
start()->
spawn(tt,loop,[0])
.
value(T) ->
T!{self(),value},
receive
Val->
Val
after 1000 -> %一秒钟超时
timeout
end
.
loop (Val) ->
receive
inc->
loop(Val+1);
{From,value}->
From! Val
end.
test() ->
P=tt:start(),
P!inc,
P!inc,
value(P).
在超时表达式的参数中有两个值有特殊意义:
- infinity
原子式infinity表示超时永远也不会发生。如果超时时间需要在运行时计算的话,这个
功能就很有用。我们可能会希望通过对一个表达式进行求值来得到超时长度:如果返回
值是infinity的话,则永久等待。
- 0
数值0表示超时会立即发生,不过在那之前系统仍然会首先尝试对邮箱中已有的消息进
行匹配。(我估计含义是:如果已有的消息匹配成功,则不运行超时子句,若此时邮
箱中没任何消息,则立即运行超时子句.)
%% 比如,确定 鼠标双击或单击事件
get_event() ->
receive
{mouse, click} ->
receive
{mouse, click} ->
double_click
after double_click_interval() ->
single_click
end
...
end.
%% 超时,sleep
sleep(Time) ->
receive
after Time ->
true
end.
%% flush_buffer()清空当前进程的邮箱:
%% 只要邮箱中还有消息,第一个消息会被匹配到(未绑定变量AnyMessage会匹配到任何消
%% 息,在这里就是第一个消息),然后flush_buffer会再次被调用,但是如果邮箱已经为
%% 空了,那么函数会从超时子句中返回。
flush_buffer() ->
receive
AnyMessage -> %注意首字母大写表示这是一个变量,所以可以否配任何传过来的消息.
flush_buffer()
after 0 ->
true
end.
%% 消息的优先级也可以通过使用0作为超时长度来实现:
%% 函数priority_receive会返回邮箱中第一个消息,
%% 除非有消息interrupt发送到了邮箱中,此时将返回interrupt
%% 即消息 interrupt 优先级较其他高.
priority_receive() ->
receive
interrupt ->
interrupt
after 0 ->
receive
AnyMessage ->
AnyMessage
end
end