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

Qt Discussion :

Erreur "timers cannot be started from another thread"


Sujet :

Qt

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut Erreur "timers cannot be started from another thread"
    Bonjour tout le monde,

    je me trouve confronté à un problème que je n'arrive pas à résoudre.

    Mon but est de réaliser une projection de QGraphicsItems entre une QGraphicsScene et un repère en coordonnées géographiques (longitude, latitude). La projection est pour commencer une projection linéaire, fausse mais simple à mettre en oeuvre.

    Aussi, j'ai besoin de stocker en coordonnées géographiques les items dessiné dans ma scène. Quand je me déplace dans le monde, je "clear" donc ma scène et redessine (ou plus précisément reconstruis) après une projection (monde->scene) les items stockés.

    Enfin, je fais un fitInView avec la projection des 4 bords en coordonnées géographiques pour adapter le viewport à la partie de ma scène mappée sur le monde.

    Je récupère les 4 bords via un autre objet que ma scène, ce dernier possèdant en membre un pointeur sur ma scène rempli via un setter setScene().

    Mon problème : Au moment de redessiner mes items, ou de faire un simple scene->addText(), j'obtiens le message :

    QObject::startTimer: timers cannot be started from another thread
    Aussi, je ne sais pas si c'est lié, mais du coup mon item n'appaît pas tout le temps à l'écran. Quand je bouge, il se met alors à disparaître, réapparaître ...

    Si vous avez des idées, n'hésitez pas

    Merci beaucoup !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Il suffit de gérer vos timers dans le thread qui les construit. Je veux dire par là, que vous avez construit vos timers dans un thread, puis vous essayez de les démarrer dans un autre et c'est ce qu'il faut éviter / ne pas faire.
    Du coup, si le timer les pas démarré, oui, il ne sera pas actif et donc la fonction appelé à la fin du timer ne le sera jamais.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Bonjour LittleWhite et merci pour votre réponse

    Oui je comprends ce que veux dire le message en fait mais je n'ai pas déclaré de thread directement de mon côté. Le message fait donc référence à un thread qui est appelé indirectement par Qt et donc qui va gérer mes timers sans, à première vue, que je le sache..

    Mon problème vient de là en réalité. Je ne vois pas à quel thread créé par Qt directement le message fait référence. De même, je ne vois de quel autre thread il s'agit dans "from another thread".

    Tout ce que je fais à la base, c'est appeler des méthodes de ma scène pour créer mes objets dans un autre objet qui a récupéré un pointeur sur celle-ci en membre.

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Bonjour,

    Une manière très simple d'utilisé des timers est de les lier a des slots et depuis les slots exécuter des actions tel que redessiner la scène.
    Pour ce faciliter la vie mettre le timer et le slot dans la même classe.

    En espèrent ça va t'aider

  5. #5
    Membre éclairé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Par défaut
    Merci knives07 pour ton aide

    En fait, mon problème est principalement un problème de compréhension. Pourquoi aurais-je besoin d'utiliser un timer dans mon exemple ?

    Et puis j'ai l'impression que ce n'est pas vraiment le problème puisque le message semble me dire que j'ai déjà un timer, même si je ne vois pas auquel il fait référence, mais que celui-ci n'est pas démarré comme il faut dans le bon thread, que je ne situe pas vraiment non plus ^^ :S

    Même si j'effectue des projections, je donne l'ordre seulement après à ma scène de se redessiner ou de se mettre à jour avec par exemple un "addItem".

    Merci

  6. #6
    Membre éclairé
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Heu...

    En fait, mon problème est principalement un problème de compréhension. Pourquoi aurais-je besoin d'utiliser un timer dans mon exemple ?
    C'est un choix si tu veux avoir un fps constant (30 par ex) il faudra utilisé un timer car si tu redessine ta scène uniquement au additem tu sera à 1 ou 0 fps mais la scène sera belle et bien dessiné.

    Même si j'effectue des projections, je donne l'ordre seulement après à ma scène de se redessiner ou de se mettre à jour avec par exemple un "addItem".
    Personnellement quand je développe en opengl par exemple je mets uniquement des timer sur les animations (un déplacement d'objet, etc ...) pour moi il y a pas besoin de faire un repaint sans avoir de changement. Si je fais des mouvements souri ou clavier pour modifier la position de la caméra j'envoie beaucoup de repaint car il y a des changements. Il faut aussi savoir que les actions repaints sont traité spécialement dans le thread des événements (en gros elles ont une priorité faible et ajouté en fin et les doublons sont supprimées).

    Dans ton cas je ferais un repaint uniquement dans ton addItem.

    Et puis j'ai l'impression que ce n'est pas vraiment le problème puisque le message semble me dire que j'ai déjà un timer, même si je ne vois pas auquel il fait référence, mais que celui-ci n'est pas démarré comme il faut dans le bon thread, que je ne situe pas vraiment non plus ^^ :S
    Alors je suis plus exactement sur mais je crois que c'est du au fait de vouloir communiquer entre différents thread. Il faut savoir que tu as quelques thread qui démarrent au lancement de ton application (main thread, event thread,...) bon ca fais longtemps que j'ai plus joué avec des timer je connais plus exactement

    Sinon dans la doc
    In multithreaded applications, you can use QTimer in any thread that has an event loop. To start an event loop from a non-GUI thread, use QThread::exec(). Qt uses the timer's thread affinity to determine which thread will emit the timeout() signal. Because of this, you must start and stop the timer in its thread; it is not possible to start a timer from another thread.
    http://qt-project.org/doc/qt-4.8/QTimer.html#details

    J'espère que c'est clair

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/02/2015, 10h27
  2. Réponses: 5
    Dernier message: 13/02/2009, 13h12
  3. Erreur : cannot be referenced from a static context
    Par Belegkarnil dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2005, 07h24
  4. Réponses: 3
    Dernier message: 05/12/2005, 10h27

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