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