(26-04-2012, 02:05 PM)Sephi-Chan a écrit : Comme on peut le voir, quand j'envoie un message contenant l'atom endive, les messages introduce suivant ne sont pas traités. Si l'on n'avait pas créé de règle pour les messages d'une autre forme, le message endive n'aurait pas été traité, mais la réception des messages suivants n'aurait pas été interrompue pour autant (je ne suis pas encore capable d'en expliquer la raison).
Si tu n'avais pas utilisé un catch-all (je te suggère d'ailleurs d'utiliser _ au lieu de Any), le process serait resté bloqué sur receive, en attente d'autres messages, et aurait pu les traiter au fur et à mesure qu'ils arrivent, les messages non reconnus de type endive seraient simplement ignorés jusqu'au prochain appel de receive.
On utilise ça qand on attend des messages avec une priorité. dans le code que je donne, on veut vérifier si la mailbox ne contient aucun message de type important, et s'il n'y en a pas, on consulte les autres messages, un truc du genre (non testé):
Code :
listen(prio) ->
receive
{important, Message} ->
do_something(Message),
listen(prio)
after 0 ->
listen()
end.
listen() ->
receive
{_, Message} ->
do_something(Message),
listen(prio)
end.
edit : la clause 'after' ne servait à rien dans la seconde fonction. ainsi c'est plus simple.