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 :

Thread et widget 3D


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut Thread et widget 3D
    Bonjour,

    Je réalise une application multiThread et ces derniers me posent encore des problèmes. Alors voilà :

    J'ai une fenêtre réalisée avec Qt Creator, dérivant donc de MainWindow. Cette fenêtre comporte un GLWidget et plein d'autres Widgets. On manipule le rendu GL avec tous les autres petits widgets.
    Mais voila, j'ai besoin de lancer une animation (succession d'images générées par le GLWidget) en cliquant sur un bouton, et étant donné que le rendu est suffisemment rapide, j'ai créé un Thread qui se charge de faire un wait entre chaque image. Mais voilà, tout s'affiche dans mon GLWIdget une fois l'animation terminée et entre temps, toute l'application est figée alors que chaque image devrait s'afficher tous les 250 millisecondes, je ne vois pas comment palier le problème...

    Voici mon code :
    Ci-dessous le constructeur de ma fenêtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Window3D::Window3D()
    {
        // Creation du widget 3d une fois la table créée
        m_widget3d = new GLWidget();
        m_widget3d->show();
     
        // Démarrage du Thread
        m_thread3d = new Thread3D(m_widget3d, nb_images);
        connect(m_thread3d, SIGNAL(send_to_widget(int)), m_widget3d, SLOT(load_image(int)));
    }
    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
     
    void Thread3D::Animation(int index)
    {
        int ind_current_image = index;
     
        while(ind_current_image <= nb_images )
        {
            cout << "write image " << ind_current_date << endl;
     
            emit send_to_widget(++ind_current_image);
            int ms = 250;
            #ifdef Q_OS_WIN
                Sleep(uint(ms));
            #else
                struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 };
                nanosleep(&ts, NULL);
            #endif
        }
    }
    Il semble que je n'aie donc toujours pas avalé la théorie avec les threads. Je pensais qu'en faisant son sleep, le thread laissait la main au widget3d qui peut alors dessiner ce qu'il a à dessiner. Or tout est bloqué... Je n'ai évidememnt plus acces aux autres fonctionnalités 3D et la Window3D est freezée le temps que la boucle de animation se termine...

    Je ne sais pas trop comment arranger ce petit problème... J'ai essayé de créer un objet Sender, instancié par le Thread, qui se charge d'envoyer le signal au widget3d pour lui dire de se recharger, mais il n'en est rien...

    Quelqu'un aurait-il une idée ?

    Merci d'avance

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    J'ai lu en diagonal, mais la question a été abordée dans un article : http://qt-labs.developpez.com/thread/opengl-qt48/
    Cela peut aider ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Et bien, je n'y ai pas franchement trouvé ma solution. Le seul paragraphe qui pourrait m'aider est le troisième et puis non, je ne trouve même pas que mon problème soit identique. Ce n'est pas mon GPU qui bloque, c'est mon Thread Fils. Le principal et le GPU sont en attente de ce dernier alors que théoriquement, un parralélisme devrait s'opérer. J'ai tout de même essayé en utilisant les fonctions doneCurrent() et makeCurrent(), mais c'est pas franchement clair, jvois pas vraiment ou les utiliser, et le thread d'échange, késako ? un troisième Thread qui permet de faire communiquer le Thread principal et le(s) fils ? De toute manière, je n'ai besoin que d'un seul contexte OpenGL. Non franchement, l'article m'a pas aidé, mais je suis certain que le problème vient de moi.

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Je m'avance peut-être un peu mais c'est de l'attente active ton sleep non ?
    Pourquoi ne pas passer par des timer ? (qui sont généralement utilisé pour les animations)
    Sinon tu reçois bien le signal ?
    Si tu envoie une seule image ton thread se termine correctement ?

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par 0_Azerty_0 Voir le message
    Et bien, je n'y ai pas franchement trouvé ma solution. Le seul paragraphe qui pourrait m'aider est le troisième et puis non, je ne trouve même pas que mon problème soit identique. Ce n'est pas mon GPU qui bloque, c'est mon Thread Fils. Le principal et le GPU sont en attente de ce dernier alors que théoriquement, un parralélisme devrait s'opérer. J'ai tout de même essayé en utilisant les fonctions doneCurrent() et makeCurrent(), mais c'est pas franchement clair, jvois pas vraiment ou les utiliser, et le thread d'échange, késako ? un troisième Thread qui permet de faire communiquer le Thread principal et le(s) fils ? De toute manière, je n'ai besoin que d'un seul contexte OpenGL. Non franchement, l'article m'a pas aidé, mais je suis certain que le problème vient de moi.
    Normal, je me suis trompé de tuto...
    http://qt-quarterly.developpez.com/q...imension/#LIII

    Sinon, j'ai pas compris pourquoi tu veux threader. Si ton rendu est plus rapide que tes FPS, tu n'as pas de problème

    Sinon, un autre tuto pour QtOpenGL : http://gbelz.developpez.com/remi-ach...vance-avec-qt/

    Et dans ton code, tu n'expliques pas comment la fonction Animation est appelée

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 129
    Par défaut
    Je m'avance peut-être un peu mais c'est de l'attente active ton sleep non ?
    Pourquoi ne pas passer par des timer ? (qui sont généralement utilisé pour les animations)
    Sinon tu reçois bien le signal ?
    Si tu envoie une seule image ton thread se termine correctement ?
    Non, le sleep n'est pas de l'attente active. On parle d'attente active lorsque l'on boucle sur une condition en vue d'effectuer une tâche lorsque la condition est remplie. en l'occurence, je me contente de faire un sleep entre chaque image.

    Bien sur j'ai pensé aux QTimer et j'ai même commencé par là, mais le problème c'est que je peux pas connecter mon Timer à ma fonction puisque je dérive pas de QObject. (s'il y a une solution à ce problème, sans dériver de QObject, je suis preneur, sinon, c'est ce que j'ai finir par faire à court terme afin d'avoir une solution "qui tourne", mais bon, je vise aussi la cohérence du programme.

    Sinon, j'ai pas compris pourquoi tu veux threader. Si ton rendu est plus rapide que tes FPS, tu n'as pas de problème
    Et bien, je dois tourner à 200 fps par défaut, mais j'ai tout de même un peu de traitement pour générer chaque image, et quand bien même je garde mes 200 fps, ce qu'il se passe, c'est que je clique sur le bouton Animation (c'est lui qui appelle la fonction Animation avec son signal clicked, réimplémenté pour l'occasion), l'image se fige jusqu'à ce que le traitement soit terminé et bim, si j'ai 200 images, je passe directement à la dernière image sans avoir visualisé les autres. Je pensais que le Thread débloquerait tout ca...

    merci pour les tutaux, j'ai tellement de liens que jfinis par en zapper !

  7. #7
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par 0_Azerty_0 Voir le message
    Bien sur j'ai pensé aux QTimer et j'ai même commencé par là, mais le problème c'est que je peux pas connecter mon Timer à ma fonction puisque je dérive pas de QObject. (s'il y a une solution à ce problème, sans dériver de QObject, je suis preneur, sinon, c'est ce que j'ai finir par faire à court terme afin d'avoir une solution "qui tourne", mais bon, je vise aussi la cohérence du programme.
    Quelle fonction ? Tes classes dérivent de QObject donc tu peux utiliser les slots, non ?

    Citation Envoyé par 0_Azerty_0 Voir le message
    Et bien, je dois tourner à 200 fps par défaut, mais j'ai tout de même un peu de traitement pour générer chaque image, et quand bien même je garde mes 200 fps, ce qu'il se passe, c'est que je clique sur le bouton Animation (c'est lui qui appelle la fonction Animation avec son signal clicked, réimplémenté pour l'occasion), l'image se fige jusqu'à ce que le traitement soit terminé et bim, si j'ai 200 images, je passe directement à la dernière image sans avoir visualisé les autres. Je pensais que le Thread débloquerait tout ca...
    Si tu appelles updateGL() à chaque fois que tu as finis le calcul d'une image, ça ne pose pas de problème
    Regarde comment je fais : http://gbelz.developpez.com/remi-ach...roduction#L2-E

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

Discussions similaires

  1. Thread, widget et mainwindow
    Par cover70 dans le forum Multithreading
    Réponses: 2
    Dernier message: 15/01/2013, 09h53
  2. Gestion de l'état des widgets Tkinter par des Threads
    Par piokml dans le forum Général Python
    Réponses: 3
    Dernier message: 18/10/2012, 11h00
  3. Widgets must be created in the GUI thread
    Par gassi64 dans le forum Qt
    Réponses: 8
    Dernier message: 29/06/2009, 14h46
  4. [SWT] synchro widget avec thread
    Par TiTiSeb dans le forum SWT/JFace
    Réponses: 7
    Dernier message: 08/09/2008, 21h21
  5. [gtkmm] thread et protection des widget
    Par Rniamo dans le forum GTK+
    Réponses: 7
    Dernier message: 15/08/2008, 17h27

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