Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4-Win] Qt, problème multithread et Labels

December 2008 modifié dans Année 2008
Bonjour, et joyeux Noël tout le monde! :)

Je développe en ce moment une application (sous windows et visual studio 2008) utilisant Qt pour faire un affichage graphique, et qui permet d'envoyer/recevoir des données avec un ordinateur distant (grâce à Wincock2), et qui dialogue aussi dans le même temps avec un petit robot.

J'utilise 1 thread pour l'envoi de données, 1 thread pour la réception de données, et la thread principale s'occupe de Qt et du petit robot. (communication avec le robot et avec l'ordinateur distant en boucle) (multithread et sockets avec l'API windows)

Après avoir reçu des données de l'ordinateur distant, je souhaite afficher ces données dans plusieurs QLabel:
maFenetrePrincipale->monLabel->setText(QString(monTexteEnString.c_str()));

Tout ceci se passe donc en boucle, mais le code plante de temps en temps à cet affichage.
J'ai vérifié, il n'y a aucun problème avec ce string, juste l'affichage qui plante au bout d'un moment (ce qui me fait planter mon programme)


Alors j'ai simplifié et testé le code pour avoir (dans un thread qui n'est pas celui qui fait tourner Qt):

while(!demandeArret)
{
//(mon code pour recevoir des données+traitement)//Ca je n'ai pas touché

maFenetrePrincipale->monLabel1->setText(QString("coucou"));
maFenetrePrincipale->monLabel2->setText(QString("est"));
maFenetrePrincipale->monLabel3->setText(QString("ce"));
maFenetrePrincipale->monLabel4->setText(QString("que"));
maFenetrePrincipale->monLabel5->setText(QString("ca"));
maFenetrePrincipale->monLabel5->setText(QString("marche"));
maFenetrePrincipale->monLabel6->setText(QString("maintenant"));
maFenetrePrincipale->monLabel7->setText(QString("?"));
}


Ca marche quelques secondes, puis le programme plante.
Si j'enlève ces setText, ça ne plante jamais...

Alors ma question: pourquoi est-ce que ça plante?
Est-ce parce que je demande l'affichage par un autre thread, même si dans le thread de Qt je ne touche jamais à ces labels?

Merci pour toute aide :)

Réponses

  • Bon très mauvaise méthode que j'avais faite donc.

    Au lieu de changer le texte des Qlabels grâce au thread qui m'apporte les données, je récupère les données sur un thread, et mets les données dans les Qlabels grâce à un Qtimer qui me les met à jour toutes les 50ms par exemple.

    Ca marche très bien comme ça, désolé pour ma nullité et aussi pour vous avoir embêtés avec cette question :)
  • En réalité, il ne faut pas effectuer d'opération avec les éléments GUI de Qt ailleurs que dans le thread principal de l'application.
    Tu peux utiliser les signaux/slots pour communiquer entre les threats et déclencher l'affichage des données par leur intermédiaire.
Connectez-vous ou Inscrivez-vous pour répondre.