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

Threads & Processus C++ Discussion :

probleme pour activer mon thread


Sujet :

Threads & Processus C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut probleme pour activer mon thread
    Bonjour à tous,

    voila je souhaite qu'une méthode de mon instance de class A puisse se lancer via un thread, et que je puisse récupérer des informations de l'utilisateur via le main. J'ai donc fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    namespace test{
        class A{
            public:
                A(int m_var1, int m_var2) : m_var1(m_var1), m_var2(m_var2), t1(&A::direA, this)
                {
     
                }
                ~A()
                {
     
                }
     
                void direA()
                {
                    for(int i = 0; i < 10; i++)
                    {
                        std::cout << m_var2;
                    }
                }
            private:
                int m_var1;
                int m_var2;
                std::thread t1;
        };
     
    }
     
    int main()
    {
        int** tab2D = nullptr;
        test::A a(0,1);
     
        //création d'un tableau 2D en dynamique
     
        std::cout << "valeur de tab2D[9][9] : " << tab2D[9][9] << std::endl;
        std::cout << "valeur de tab2D[0][0] : " << tab2D[0][0] << std::endl;
     
        //delete le tableau 2D
     
        while(true)
        {
                //recupere de l'information via cin
        }
    }
    Le probleme est quand je lance mon programme j'ai sur mon terminal :
    valeur de tab2D[9][9] : 0
    valeur de tab2D[0][0] : 0
    et je ne vois aucune 1 apparaitre... pourtant l'appelle de mon constructeur appelle le thread et donc la boucle pour lancer le 1 dix fois

    Avez vous une idée du pourquoi ?

    Merci d'avance

    PS : dsl pour l'affichage du code mais je ne vois aucune balise code

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Où se trouve la création du tableau ?
    Où se trouve le remplissage du tableau ?
    "en attente de cin" je suppose que c'est un truc du genre getline ou autre qui bloque le terminal ? S'il est bloqué tu auras bien du mal à voir ce qui s'écrit dessus.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    je n'ai pas mis la création du tableau pour éviter d'alourdir la lecture du code pour vous mais ca donne ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        tab2D = new int* [10];
        for(int i = 0; i < 10; i++)
        {
            tab2D[i] = new int[10];
        }
     
        for(int i = 0; i < 10; i++)
        {
            for(int j = 0; j < 10; j++)
            {
                tab2D[j][i] = 0;
            }
        }
    La boucle est vide pour l'instant, je fais déja un test comme ca pour voir si tout marche correctement mais non ...

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                void direA()
                {
                    for(int i = 0; i < 10; i++)
                    {
                        std::cout << m_var2;
                    }
                }
    Ca donne quoi si tu rajoutes un petit << std::endl ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je maintiens que tu ne vois rien parce que la console est bloquée sur ton attente sur cin.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    La boucle while est vide il n'y a rien dedans meme pas un std::cin

    Le std::endl; fonctionne mais je ne sais absolument pas pourquoi l'objet endl est necessaire ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Parce que endl force un flush du buffer.
    Tu devrais aussi avoir un join quelquepart pour attendre que le thread ait fini, sinon ton programme va s'arrêter avant.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    Le join n'est pas necessaire car je rentre dans une boucle infinie.

    ah d'accord pour le flush du buffer, d'ailleurs si je retire std::endl et je demande 5000 "1" au lieu des dix je recupere bien l'affichage

    Merci de l'info

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Note qu'au besoin std::cout << std::flush permet de forcer le flush sans retour à la ligne.
    Ne surtout pas en abuser. Cela détruirait toutes les performances gagnées par l'utilisation du buffer.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Thread] Probleme pour arreter des threads
    Par Djobird dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 15/02/2008, 21h31
  2. Réponses: 1
    Dernier message: 14/11/2007, 13h11
  3. probleme pour récupérer mon JavaCompiler
    Par Kuroro dans le forum Langage
    Réponses: 1
    Dernier message: 19/05/2007, 18h37
  4. double clic pour activer mon SWF sous IE
    Par raldine dans le forum Flash
    Réponses: 1
    Dernier message: 15/02/2007, 13h26
  5. Réponses: 2
    Dernier message: 22/04/2004, 13h28

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