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

Multithreading Discussion :

Impossible de lancer mon nouveau QThread [QThread]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de demonixis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2008
    Messages : 80
    Par défaut Impossible de lancer mon nouveau QThread
    Bonjour,

    Je code une application qui demande un traitement réguliers (jouer un son) et pour cela j'utilise un QThread (normal non ?). J'ai lu la documentation et quelques posts sur des forums us et fr et je suis là car même après tout ça je ne trouve pas mon erreur.

    J'ai une classe battement qui dérive de QThread, elle est chargée de jouer un son toute les n-secondes, j'ai donc d'un coté cette classe qui s'occupe de faire le traitement "jouer le son" dans la méthode run() et d'un autre coté j'ai une classe qui dérive de QWidget qui me permet de lancer le Thread et l'arrêter (of course), sur le papier c'est pas mal mais quand je lance le Thread j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    QObject: Cannot create children for a parent that is in a different thread.
    (Parent is QApplication(0x22fe68), parent's thread is QThread(0x317480), current thread is QThread(0x1495f90)
    QThread: Destroyed while thread is still running
    Pas de code graphique dans le Thread ? c'est ce que j'ai lu partout et il ne me semble pas en avoir, je ne fait que des traitements..

    J'ai essayer de lancer mon Thread via l'événement d'un bouton (clicked) avec un slot perso mais pas moyen, et j'ai tenté de lancer le thread avec le signal du bouton sur le slot start() du thread, mais là toujours la même erreur..

    Je sèche mais j'aimerais vraiment comprendre ce qui cloche voici donc mon code (qui n'est pas trop long heureusement)

    battement.h : La thread en action

    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
     
    #ifndef BATTEMENT_H
    #define BATTEMENT_H
     
    #include <QThread>
    #include <QString>
    #include <QSound>
    #include <QObject>
     
    class Battement : public QThread
    {
    public:
        Battement(QObject *parent = 0);
        virtual ~Battement();
     
    protected:
        void run();
     
        // Mutateur inline
        int currentBpm() { return m_bpm; }
        int currentSample() { return m_sampleName; }
        // Accesseur
        void setBpm(const int&);
        void setSample(const int&);
     
    private:
        QString determineStringSample();
        // Determine le temps de pause entre chaque battement
        // 1 seconde / nombre de battements par secondes
        float determineTempo() { return (60000 / m_bpm); }
     
    private:
        int m_bpm;
        int m_sampleName;
        float m_tempo;
    };
     
    #endif // BATTEMENT_H
    battement.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
    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
    46
    47
    48
    49
    50
    51
    52
     
    #include "battement.h"
     
    Battement::Battement(QObject *parent) : QThread(parent)
    {
        m_bpm = 96;
        m_sampleName = 2;
    }
    Battement::~Battement()
    {
     
    }
     
    void Battement::run()
    {
        msleep(long(determineTempo()));
        QSound::play(determineStringSample());
        exec();
    }
     
    void Battement::setBpm(const int &bpm)
    {
        if (bpm <= 30)          // Bpm Min
            m_bpm = 30;
        else if (bpm >= 250)    // Bpm Max
            m_bpm = 250;
        else
            m_bpm = bpm;        // Bpm Perso
    }
     
    void Battement::setSample(const int &sampleName)
    {
        m_sampleName = sampleName;
    }
     
    QString Battement::determineStringSample()
    {
        QString sampleName;
     
        switch (m_sampleName)
        {
        case 0: sampleName = "/res/samples/bass1.wav";   break;
        case 1: sampleName = "/res/samples/bass2.wav";   break;
        case 2: sampleName = "/res/samples/noise.wav";   break;
        case 3: sampleName = "/res/samples/snare1.wav";  break;
        case 4: sampleName = "/res/samples/snare2.wav";  break;
        case 5: sampleName = "/res/samples/snare3.wav";  break;
        case 6: sampleName = "/res/samples/snare4.wav";  break;
        default: sampleName = "/res/samples/noise.wav";  break;
        }
        return sampleName;
    }
    YMetronome.cpp : Voilà où ça coince (je vous épargne le code qui n'a rien à voir)

    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
    46
    47
    #include "YMetronome.h"
     
    YMetronome::YMetronome() : QWidget()
    {
        initializeWindow();
        initializeComponents();
        initializePresentation();
        initializeConnections();
    }
     
    YMetronome::~YMetronome()
    {
        delete e_battement;
    }
     
    // Méthodes d'intialisation
    void YMetronome::initializeWindow()
    {
        setFixedSize(500, 150);
        e_battement = new Battement;      // 1. Déclaration :D
    }
     
    // Des méthodes qui n'ont rien à voir avec notre (mon) problème
     
    void YMetronome::initializeConnections()
    {
        QObject::connect(m_btLancer, SIGNAL(clicked()), this, SLOT(playSample()));
        QObject::connect(m_btStopper, SIGNAL(clicked()), this, SLOT(stopSample()));
        QObject::connect(m_sbBpmPerso, SIGNAL(valueChanged(int)), this, SLOT(bpmChanged(int)));
        QObject::connect(m_cbChoixBpm, SIGNAL(currentIndexChanged(int)), this, SLOT(bpmChanged(int)));
        QObject::connect(m_cbChoixSample, SIGNAL(currentIndexChanged(int)), this, SLOT(sampleChanged(int)));
        QObject::connect(m_btLancer, SIGNAL(clicked()), e_battement, SLOT(start())); // 2.Derniers trucs essayés
    }
     
     
    // Slots personnalisés
    void YMetronome::playSample()
    {
        // e_battement->start(); 
        emit playingSample(true);
    }
     
    void YMetronome::stopSample()
    {
        // e_battement->quit();
        emit playingSample(false);
    }

    Je n'est pourtant pas de code graphique dans mon Thread donc je ne comprend pas trop ce qui se passe. Je ne suis pas contre une petite explication Bon je retourne sur la FAQ Qt en attendant (j'ai trouvé des posts qui la pointait mais je n'y ai pas trouvé réponse à mon problème)

    Merci.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    QObject: Cannot create children for a parent that is in a different thread.
    (Parent is QApplication(0x22fe68), parent's thread is QThread(0x317480), current thread is QThread(0x1495f90)
    QSound est une classe de QtGui et y as de forte chance que tu ne puisse pas l'utiliser dans un thread, comme les widget. Je pense que l'erreur viens de là.
    QSound est asynchrone, pourquoi une thread?


    QThread: Destroyed while thread is still running
    ton intance de QThread (battement?) est détruit alors que tu n'est pas encore sortie de la fonction run (et donc ta thread tourne toujours).

  3. #3
    Membre confirmé Avatar de demonixis
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2008
    Messages : 80
    Par défaut
    Merci pour la réponse, donc ça viendrais de QSound... en fait j'utilise QSound à des fins de test, car l'application final utilisera FmodEx donc si c'est à cause de QSound ça sera réglé.

    ton intance de QThread (battement?) est détruit alors que tu n'est pas encore sortie de la fonction run (et donc ta thread tourne toujours).
    Quand j'ai lancé le programme pour récupérer l'erreur et la poster sur le forum j'ai fermé directement l'application sans cliquer sur "stop" (je gérerais ça à la dé construction de l'objet quand j'aurais résolu ce problème ^^)

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

Discussions similaires

  1. impossible de lancer mon application via jar ou ant
    Par bobkilla dans le forum Langage
    Réponses: 8
    Dernier message: 25/06/2008, 14h53
  2. Impossible de lancer mon application
    Par lvr dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/04/2007, 09h11
  3. impossible de lancer mon jar sous kubuntu
    Par altadeos dans le forum NetBeans
    Réponses: 2
    Dernier message: 14/11/2006, 13h45
  4. [C#] impossible de lancer mon appli sur un autre PC
    Par xtream dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/09/2006, 15h40
  5. [RMI] Impossible de lancer mon serveur
    Par Dahu dans le forum API standards et tierces
    Réponses: 11
    Dernier message: 11/06/2006, 09h17

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