2016-12-10 8 views
0

私はErlangで機能の仕事をした後に私の受信を行うことに問題があります。私はグーグルでこれをしばらく頭に打ちましたが、それを理解できていないようで、助けが必要です。私は以下のプロセスを実行し、メッセージを待つプロセスを持っています。Erlang after after

% Waits for messages, and puts them into the list. 
% If the list has the same length as the Length variable 
% which is the original provided list, then it means we are done 
% and can print the results. 
% If the MaxTime has passed it should just print the provided list. 
wait_max_time(List, Length, MaxTime) -> 
io:format("I am ~p and waiting...~n", [self()]), 
receive 
    X -> 
     Results = List ++ [X], 
     case length(Results) =:= Length of 
      true -> 
       io:format("~p~n", [Results]), 
       exit(self()); 
      false -> 
       wait(Results, Length) 
     end 
after MaxTime -> io:format("List is ~p~n", [List]) 
end. 

上記のすべてがうまくいくように見えますが、それは常に計算され、印刷文で確認されています。

しかし、計算に時間がかかりすぎる場合は、そのリストを印刷して続行します。しかし、決してコード内で走ったことがないと、何が間違っていますか?

+2

'false - > ...'で 'wait_max_time'を呼び出し、' wait'を呼び出さなかったのですか? – Dogbert

+2

問題点:[リスト処理](http://erlang.org/doc/efficiency_guide/listHandling.html)の#1ルールは、リストの末尾に決して追加しないということです。非常に短いリストでも問題ありませんが、 '[X |リスト]の代わりに 'リスト++ [X] 'を使用します。 –

+0

あなたが指定したコードは実際に問題を実証していません。 [SSCCE](http://sscce.org/)はあなたに良い答えを得るための道のりです。あなたがこのプロセスにメッセージを流すことで、あなたが遅くなっているかもしれません。 'after'タイムアウトは、メッセージが受信されるたびにリセットされることに注意してください。 –

答えて

0

コメントにDogbertが指摘したように、タイムアウトのない別の関数を呼び出した関数の名前をfalseに変更するのを忘れてしまったのは間違いです。

問題は解決しました。ありがとうございます。