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 :

problème de création de thread


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 410
    Points : 393
    Points
    393
    Par défaut problème de création de thread
    Bonjour,
    utilisant d'habitude Qt, j'ai voulu tester la gestion des threads de la bibliothèque standard mais j'ai rencontré un problème. Voici un petit programme de test qui met ce problème en évidence:


    source.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "testThread.h"
    #include <iostream>
     
     
    int main()
    {
        testThread test(5);
     
     
        return 0;
    }
    testThread.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #pragma once
    class testThread
    {
    public:
        testThread(int param);
     
    private:
        void runThread();
        int itr;
    };
    testThread.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <thread>
    #include <iostream>
    #include "testThread.h"
     
    testThread::testThread(int param):itr(param)
    {
        std::thread myThread(&testThread::runThread, this);
    }
     
    void testThread::runThread()
    {
        for (int i = 0; i < itr; i++)
            std::cout << "hello" << std::endl;
    }
    La classe testThread lance donc un thread qui affiche hello autant de fois que la valeur du paramètre passé lors de son instanciation.


    Cependant, même si l'affichage final est correct, j'obtiens le message d'erreur joint en mode debug:

    En mode release, le programme crashe.


    Je travaille avec visual studio 2013.


    merci à ceux qui prendront le temps de lire ce message et pourront m'apporter une solution.
    Images attachées Images attachées  

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 410
    Points : 393
    Points
    393
    Par défaut
    Honte à moi.
    C'est juste que le programme se terminait avant le thread.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    6 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 6 674
    Points : 30 457
    Points
    30 457
    Billets dans le blog
    4
    Par défaut
    Salut,

    tu as trouvé ton erreur, mais il y a à redire sur ton code.
    Le plus important est que si ta classe est sensé encapsuler un thread, il faudrait que le thread soit en variable membre.
    Là tu crées un thread que tu ne contrôles absolument plus dès la sortie du constructeur.
    Ca te permettrait de pouvoir le join pour que le programme s'arrête proprement.
    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.

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    juin 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : juin 2004
    Messages : 410
    Points : 393
    Points
    393
    Par défaut
    Merci pour tes remarques, je suis toujours preneur.

    En fait c'était juste une version minimale pour mettre le problème en évidence. la version que j'utilise finalement ressemblera plutôt à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "testThread.h"
    #include <iostream>
     
    int main()
    {
        testThread test(5);
        test.start();
        test.wait();
     
        return 0;
    }
    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
    #pragma once
    #include <thread>
     
    class testThread
    {
    public:
        testThread(int param);
        void start();
        void wait();
     
    private:
        std::thread myThread;
        int itr;
     
        void runThread();
    };
    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
    #include <iostream>
    #include "testThread.h"
     
    testThread::testThread(int param):itr(param)
    {
    }
     
    void testThread::runThread()
    {
        for (int i = 0; i < itr; i++)
            std::cout << "hello" << std::endl;
    }
     
    void testThread::start()
    {
        myThread = std::thread(&testThread::runThread, this); // Lance le thread
    }
     
     
    void testThread::wait()
    {
        if (myThread.joinable())
            myThread.join();
    }
    Cà te semble cohérent?

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

Discussions similaires

  1. Problème de création de thread
    Par [Silk] dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2006, 21h58
  2. Réponses: 7
    Dernier message: 16/06/2004, 15h02
  3. Problème de création de table sous MySql
    Par ducamba dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2003, 09h59
  4. Problème de création de fenêtre
    Par tomateauketchup dans le forum DirectX
    Réponses: 1
    Dernier message: 08/06/2003, 19h42
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

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