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

[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




reply via email to

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