certi-devel-french
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE : CERTI-Devel-French Digest, Vol 10, Issue 3


From: HADJ AMOR HASSEN
Subject: RE : CERTI-Devel-French Digest, Vol 10, Issue 3
Date: Wed, 13 Jun 2007 16:49:22 +0200 (CEST)





Message: 4
Date: Tue, 12 Jun 2007 16:57:02 +0200
From: "Eric Noulard"
Subject: Re: RE : Re: RE : Re: Erreur avec sendInteraction()
To: "CERTI development discussions in French"

Message-ID:

Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Le 12/06/07, HADJ AMOR HASSEN 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



Bonjour


J'ai opté pour la première solution et ça marche, je vous remercie. Voici le bout de code que j'ai inséré pour remplacer le cin.getline blocante.

Code:

---------------------------------------------------------------------------------------------------------------------------

struct timeval tv = { 0, 0 };
        fd_set readfds;

        FD_ZERO(&readfds);
        FD_SET(STDIN_FILENO, &readfds);
       
        if  (select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv) == 1)
            {
       
            gets(text);
            chatting.sendMessage(text);
            cout << ">  " << endl; 
            };


_______________________________________________________________________


Il reste quelques modifications et je partagerai l'application à vous.

Merci encore pour votre aide.

Cordialement,

Hassen


Ne gardez plus qu'une seule adresse mail ! Copiez vos mails vers Yahoo! Mail
reply via email to

[Prev in Thread] Current Thread [Next in Thread]