IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Utilisation de cout et printf


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut Utilisation de cout et printf
    Bonjour,
    J'ai un programme dans lequel j'ai plusieurs threads. Ces threads affichent du texte avec cout.
    Mon problème c'est que quand je veux afficher des variables avec par exemple la ligne de code suivante dans un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cout << " La variable A vaut "<<A<< " et la variable B vaut : "<< B << "\n" << endl;
    , et la ligne de code suivante dans un 2eme thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << " Il fait "<<temperature<< " degrés aujourd'hui\n" << endl;
    et bien , j'ai parfois les écritures des 2threads qui se chevauchent.
    Exemple :
    Dans le cas ou il faudrai afficher les 2 phrases suivantes :
    -le thread 1 devrait afficher "La variable A vaut 5 et la variable B vaut 10"
    -le thread 2 devrait afficher "Il fait 7 degrés aujourd'hui"

    Cela peut donner par exemple
    "La variable A vaut Il fait 5 7 et la variable B vaut degrés aujourd'hui
    10".

    En gros, ca alterne l'affichage de chaque threads. comment rectifier le probleme?

    J'ai pensé à des printf() qui rectifient bien cela et empechent l'alternance, mais là se pose un autre problème, cette fois ci avec un affichage de string. Quand j'écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	string texte ="aaaaa";
    	printf("\nprintf : %s ",texte );
    	cout <<"\ncout : "<< texte << "\n" << endl;
    , j'obtiens :
    "printf :
    cout : aaaaa"

    En fait le printf n'affiche pas mon string...

    Cela fait plusieurs questions, j'espere que quelqu'un pourra m'aider

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    %s attend un pointeur vers une chaîne de type C, pas un std::string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\nprintf : %s ",texte.c_str());
    Sinon tu peux aussi utiliser un mutex pour bloquer un thread pendant que l'autre écrit sur la sortie standard.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 83
    Par défaut
    Citation Envoyé par Laurent Gomila
    %s attend un pointeur vers une chaîne de type C, pas un std::string.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("\nprintf : %s ",texte.c_str());
    Sinon tu peux aussi utiliser un mutex pour bloquer un thread pendant que l'autre écrit sur la sortie standard.
    Oui, pas bete, je vais tenter le mutex !! Merci Laurent
    Pour info personelle , comment faire pour afficher un std::string avec un printf ??

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est marqué dans ta citation.
    Il n'y a pas d'autre moyen.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Sinon tu fais d'abord un premier flux temporaire spécifique au thread (par exemple stringstream) et après tu le recopies sur cout

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Il doit y avoir moyen de détourner le streambuf de cout, pour le remplacer par une aggrégation de streambufs liés chacun à un thread différent. Le locking se faisant au moyen de l'écriture sur stdout.
    OK, c'est tordu.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 23
    Par défaut
    Je viens de tomber sur ce trhead par hasard.

    Si c'est du dev Windows il faut encadrer les morceaux de code qui ne doivent pas être executés simultanément par des instructions dont je ne me rapelle plus le nom

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 27
    Par défaut
    J'ai pensé à des printf() qui rectifient bien cela et empechent l'alternance.
    pourquoi, il se passe quoi quand les 2 printf ce font en meme temp ?
    l'un bloque l'autre ?

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    ça n'a rien à voir avec l'utilisation de printf ou cout, si tu ne veux pas que l'affichage se chevauche, il faut protéger l'écriture sur la sortie avec un mutex.

Discussions similaires

  1. Utilisation de la fonction Printf
    Par alex2746 dans le forum Langage
    Réponses: 7
    Dernier message: 25/09/2009, 11h23
  2. Utiliser une seule fois printf
    Par Minouchka dans le forum Débuter
    Réponses: 2
    Dernier message: 16/11/2007, 18h13
  3. Réponses: 8
    Dernier message: 29/03/2007, 11h16
  4. sortis écran printf ou cout
    Par gdpasmini dans le forum MFC
    Réponses: 6
    Dernier message: 22/06/2006, 14h23
  5. Utilisation de 'cout' et code portable ??
    Par LaVaZza dans le forum SL & STL
    Réponses: 3
    Dernier message: 05/12/2005, 19h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo