26-04-2012, 09:00 PM
(Modification du message : 26-04-2012, 09:21 PM par Sephi-Chan.)
Pour en revenir aux messages entre processus. On va modifier le programme pour que le processus envoie un message en retour après avoir reçu un message d'introduction.
Ici, on change le pattern du message : avant on attendait seulement l'atom
Ici, quand l'envoyeur va envoyer un message, il va envoyer un tuple contenant son propre Pid et l'atom
D'ailleurs, on peut voir qu'en recevant le message
Pour régler ça, il faudrait ajouter une nouvelle règle au
Comme ceci :
Ici, j'ai utilisé la fonction
Pour essayer ce code :
Et voilà ! Deux personnages sont capables de discuter ensemble !
- module(character).
- export([ character/0 ]).
character() ->
receive
{ Sender, introduce } ->
io:format("Received introduce message.~n"),
Sender ! reply,
character();
_Any ->
io:format("Received other kind of message. Stop listening.~n"),
void
end.
Ici, on change le pattern du message : avant on attendait seulement l'atom
introduce
, maintenant on accepte un tuple composé de quelque chose et de introduce
. Ce quelque chose, ça va être le Pid du processus qui a envoyé le message : quand on attend une réponse de quelqu'un, on s'assure de lui donner notre adresse.Ici, quand l'envoyeur va envoyer un message, il va envoyer un tuple contenant son propre Pid et l'atom
introduce
. Ainsi, l'autre lui répondra l'atom reply
!D'ailleurs, on peut voir qu'en recevant le message
introduce
, il va se heurter à la seconde règle du receive
et donc arrêter de recevoir des messages ! Pour régler ça, il faudrait ajouter une nouvelle règle au
receive
pour gérer la réception d'un message contenant l'atom reply
.Comme ceci :
- module(character).
- export([ character/0 ]).
character() ->
receive
{ Sender, introduce } ->
io:format("~p received introduce message.~n", [self()]),
Sender ! reply,
character();
reply ->
io:format("~p received reply message.~n", [self()]),
character();
_ ->
io:format("~p received other kind of message. Stop listening.~n", [self()]),
void
end.
Ici, j'ai utilisé la fonction
self
qui retourne le Pid du processus courant.Pour essayer ce code :
96> Character1 = spawn(character, character, []).
<0.198.0>
97> Character2 = spawn(character, character, []).
<0.200.0>
98> Character1 ! { Character2, introduce }.
<0.198.0> received introduce message from <0.200.0>.
{<0.200.0>,introduce}
<0.200.0> received reply message.
99> Character1 ! { Character2, introduce }.
<0.198.0> received introduce message from <0.200.0>.
{<0.200.0>,introduce}
<0.200.0> received reply message.
100> Character2 ! { Character1, introduce }.
<0.200.0> received introduce message from <0.198.0>.
{<0.198.0>,introduce}
<0.198.0> received reply message.
Et voilà ! Deux personnages sont capables de discuter ensemble !