[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: RE : Re: RE : Re: Erreur avec sendInteraction()
From: |
Eric Noulard |
Subject: |
Re: RE : Re: RE : Re: Erreur avec sendInteraction() |
Date: |
Tue, 12 Jun 2007 16:57:02 +0200 |
Le 12/06/07, HADJ AMOR HASSEN<address@hidden> a écrit :
J'ai essayé d'insérer des tick dans mon code mais le problème persiste
encore. J'avais des doutes que le problème vient de la boucle de simulation
qui contient la fonction getline(). Voici le code de la boucle de simulation
dans le fichier main.cc:
-------------------------------------------------------------------------------------------------------------------------
//simulation loop
while (true) {
char text[256];
chatting.ticktest();
cin.getline(text, sizeof(text));
if (!strcmp(text, "."))
{
break;
}
chatting.sendMessage(text);
chatting.ticktest();
}
la fonction getline est bloquante:
http://www.cplusplus.com/reference/iostream/istream/getline.html
istream& getline (char* s, streamsize n, char delim );
delim
The delimiting character. The operation of extracting succesive
characters is stopped when this character is read. This parameter is
optional, if not specified the function considers '\n' (a newline
character) to be the delimiting character.
J'ai essayé d'envoyer des valeurs qui s'auto-incrémentent d'un fédéré à un
autre. J'ai réussi, la réception des interactions est instantané.
Ceci confirme l'hypothèse ci-dessous:
Du coup, je pense que le problème est dû à l'utilisation de la fonction
getline().. qui apparemment s'exécute jusqu'à détection du retour chariot
"/n" et empêche ensuite l'affichage du message envoyé par l'un des fédérés
par interaction.
Exact. Pour ce genre d'application "interactive" on ne peut
pas faire de lectures (ou d'écritures) le cas échéant qui soient bloquantes
car on bloque "le reste de l'activité".
A partir de là 2 famille de solutions:
A) utiliser des fonctions de lecture/écriture non bloquantes
par exemple istream::readsome
ou bien utiliser les fonctions C plutôt que C++ et
utiliser l'appel système select(2) pour vérifier si il y a qqchose à lire
B) créer des threads (ou processus) indépendants qui
s'occuperont de gérer ces entrées/sorties bloquantes sans
géner l'activité principale.
Je pense que la réception de l'interaction est instantanée mais l'affichage
du ou des message(s) reçu(s) n'est pas instantané. En fait, il faut que je
tape un message à envoyer et je tape entrée pourque je puisse recevoir le
ou les messages tapées dans l'autre fédéré.
Est ce que vous avez une idée pour remedier à ce petit problème?
Voir les suggestions ci-dessus.
--
Erk