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 :

Warning: QObject::moveToThread: Cannot move objects with a parent


Sujet :

Multithreading

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 66
    Points : 50
    Points
    50
    Par défaut Warning: QObject::moveToThread: Cannot move objects with a parent
    Bonjour,

    je suis en train de développer un logiciel et j'ai quelques soucis entre la gui et le chargement d'une vidéo qui peut prendre quelques secondes à cause d'éléments d'initialisation.
    Je voudrais pouvoir afficher un BusyIndicator le temps que ma vidéo se charge pour indiquer à l'utilisateur que tout va bien et qu'il faut juste qu'il soit un peu patient.
    Sauf que tout ne fonctionne pas exactement comme je le souhaite.

    J'ai donc un fichier qml
    Code qml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Rectangle {
        id : videoDisplay
    ...
        BusyIndicator{
             id: busyIndicator
             anchors.centerIn: parent
             running: false
        }
     
        VideoManager{ // classe C++ pour gérer l'affichage de ma vidéo - détaillé ci-dessous
           id: videomanager
           onPathChanged{ // changement de chemin
                  busyIndicator.running = true;
                  videomanager.loading(); // chargement de la vidéo
           }

    et une classe C++
    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
    class VideoManager : public QQuickPaintedItem
    {
     
        Q_OBJECT
    public:
         VideoManager(QQuickItem *parent=0)
         ...
        Q_INVOKABLE  void loading();
    public slots:
        void initialize();
        ...
    };
     
    VideoManager::VideoManager(QQuickItem *parent) :
        QQuickPaintedItem(parent),
    ...{
    ...
    }
     
     
    void VideoManager::loading(){
            ... // chargement de divers éléments et mise en connection de signaux variés
     
            QThread *thread = new QThread();
            moveToThread(thread);
            connect(thread, SIGNAL(started()), this, SLOT(initialize()));
            connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
            thread->start();
     
           ...
    }    
     
    void VideoManager::initialize(){
           if(myVideoReader_->initialize()){ // tout est bon
                QObject::connect(myVideoReader_, SIGNAL(updateDisplay()), this, SLOT(onUpdateDisplay())); // connexion de l'affichage
                ...
                emit okSignal();
           }
           else{
               ...
               emit koSignal();
           }
    }
    Pourquoi je mets ma fonction initialize dans un thread? Car sinon mon interface graphique est bloqué et je n'ai pas mon busyindicator actif.
    J'ai essayé un QConcurrent::run sans grand succès (j'ai d'ailleurs un problème d'accès aux attributs de ma classe quand je les utilise).

    Ma question est comment faire pour résoudre ce soucis de thread car parfois ça marche et parfois ça ne marche pas mais j'ai toujours le Warning: QObject::moveToThread: Cannot move objects with a parent
    Ce qui veut dire que ce que j'ai écrit est un correct or je ne vois pas trop comment résoudre cette gestion de l'héritage et de thread.

    Merci de toute l'aide et explication que vous pourriez m'apporter
    L'elfe d'Azur

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2010
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2010
    Messages : 248
    Points : 421
    Points
    421
    Par défaut
    Bonjour,

    Il n'est donc pas possible de déplacer l'instance de VideoManager dans un thread différent car il est lié à son parent (Rectangle, id: "videoDisplay") qui en plus de ça vit" dans le thread principal (GUI thread). Mais même sans parent, cela ne serais pas possible car les éléments graphique ne peuvent exister que dans le thread principal.

    De plus il y a une autre problème, le thread crée n'est jamais détruit dans votre application, ce qui va certainement générer des fuites de mémoires voir pire.

    Ce qu'il faudrait c'est plutôt créer une autre classe, par ex. VideoLoader, dédiée au traitement qui doit se faire dans un thread différent, et ensuite de communiquer avec la class VideoManager en utilisant les signaux/slots.

    Je vous conseille fortement de vous inspirer de l'exemple fourni dans la documentation de QThread, utilisant QObject::moveToThread() et le concept de "Controller" + "Worker". C'est selon moi la meilleure option pour votre application.

    L'utilisation de QRunnable et QThreadPool peut aussi être une option.

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/10/2011, 13h58
  2. Cannot use object linking or embeding
    Par LefortLudovic dans le forum Excel
    Réponses: 3
    Dernier message: 04/01/2008, 17h43
  3. Réponses: 2
    Dernier message: 27/07/2007, 09h21
  4. it cannot be parameterized with arguments
    Par MacReiben dans le forum Hibernate
    Réponses: 4
    Dernier message: 10/07/2006, 15h29

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