代码之家  ›  专栏  ›  技术社区  ›  grifaton

Erlang:receive语句具有多个超时子句

  •  2
  • grifaton  · 技术社区  · 16 年前

    receive语句是否可能有多个超时子句,如果有,正确的语法是什么?

    foo(Timout1, Timeout2) ->
        receive
        after
            Timeout1 ->
                doSomething1();
            Timeout2 ->
                doSomething2()
        end.
    

    在哪里,取决于以下哪种情况: Timeout1 Timeout2 doSomething1() doSomething2 被称为。但是,上面的代码会导致语法错误。

    提前谢谢!

    2 回复  |  直到 16 年前
        1
  •  4
  •   Hynek -Pichi- Vychodil Paulo Suassuna    15 年前

    不,你不能。在收到之前决定做什么。

    foo(Timeout1, Timeout2) ->
        {Timeout, ToDo} = if Timeout1 < Timeout2 -> {Timout1, fun doSomething1/0};
                             true -> {Timeout2, fun doSomething2/0} end,
        receive
        after Timeout -> ToDo()
        end.
    

    foo(Timeout1, Timeout2) when Timeout1 < Timeout2 ->
        receive
        after Timeout1 -> doSomething1()
        end;
    foo(_, Timeout2) ->
        receive
        after Timeout2 -> doSomething2()
        end.
    

        2
  •  0
  •   jldupont    16 年前

    您可能应该结合使用“gen_fsm”和“timer:send_after”。