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 :

QThread et QTimer, incompatibilité ?


Sujet :

Multithreading

  1. #1
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut QThread et QTimer, incompatibilité ?
    Bonjour,

    mon problème est simple, tous les QTimer ou QTimer::singleshot que j'utilise depuis mon thread secondaire ne fonctionne pas.
    Mon code compile, pas d'erreur mais QTimer ne lance pas la fonction.
    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
    void Thread::run()
    {
        timer = new QTimer(0);
        timer->setInterval(100);
        timer->moveToThread(this);
        connect(timer, SIGNAL(timeout()), this, SLOT(toto2()));
        timer->start();
     
        while(true)
        {
            //...
        }
     
    }
    void Thread::toto2()
    {
        cout << "Bonjour" << endl;
    }
    PS : J'ai déjà essayé pas mal de trucs, ça fait 3 heures que je suis sur ce problème.

  2. #2
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Je viens de trouver la solution à mon problème, il fallait juste que j’appelle cette fonction depuis mon thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QCoreApplication::processEvents()
    Du coup je l'ai ajouté à ma fonction sleep et ça marche nickel.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 905
    Points : 220 157
    Points
    220 157
    Billets dans le blog
    126
    Par défaut
    Bonjour,

    La fonction processEvent() ne devrait être appelé que dans un cas très rare : celui où vous bloquer votre thread principal avec une tâche. En effet, la fonction de traitement des événements est appelé automatiquement dans le thread principal, par Qt (tant que vous ne bloquez pas celui-ci).

  4. #4
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re
    "tant que vous ne bloquez pas celui-ci" ???

    Je ne vois pas ce que tu veux dire par là, quand mon thread effectue des calculs ou un traitement, il est forcément bloqué c'est pour cela qu'il faut appeler QCoreApplication::processEvents() à chaque itérations de ma boucle de calcul.
    En fessant cela, "Qt" reprends la main sur mon threads et peux y executer le QTimer.

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 905
    Points : 220 157
    Points
    220 157
    Billets dans le blog
    126
    Par défaut
    Si vous lisez tous les guides d'optimisation Qt, vous verrez rapidement que l'appel à processEvent() est déconseillé.
    Maintenant, ce qu'il faut faire, c'est faire un autre thread, spécifique pour vos calculs. Ainsi, vous êtes certains de ne pas bloquer l'UI. Pourquoi ? Car :
    • rien ne vous dit que votre traitement ne va jamais se bloquer (bogue, attente BDD...) ;
    • l'utilisateur peut continuer à manipuler l'UI (déplacer la fenêtre sans saccade, réduire la fenêtre, voir une barre de progression).

    Bien sûr, vous aurez un résultat avec processEvent(), mais que, personnellement, je ne juge pas bon (surtout depuis dix ans et les CPU multi coeur).
    Je tiens à rappeler ceci, de l'auteur original :
    mon problème est simple, tous les QTimer ou QTimer::singleshot que j'utilise depuis mon thread secondaire ne fonctionne pas.
    Il a déjà un thread secondaire et ne devrait donc absolument pas appelé processEvent(). En plus, il a sûrement un bogue, semble t-il que son premier thread exécute la fonction de traitement (erreur de manipulation de QThread ?).

  6. #6
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut re tardif
    Cela je le sais bien mais ce n'était pas là le problème que j'avais.
    Mon problème était que je ne pouvais pas appeler de QTimer depuis un thread car celui-ci de se lançais pas. En faite, je voulais utiliser un QTimer dans ma boucle de calcul pour faire du multi-threading mais avec le recul, je me rends compte que cela était débile, j'aurais du passer pas un enfant de QThread comme j'ai fait pour ma boucle de calcul.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/11/2010, 21h24
  2. Réponses: 0
    Dernier message: 27/10/2010, 01h45
  3. [QThread] Problème avec QTimer et QThread
    Par scary dans le forum Multithreading
    Réponses: 7
    Dernier message: 15/12/2009, 18h00
  4. UPDATE+max= Incompatibilité?
    Par $grm$ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 21/05/2004, 16h43
  5. problème d'incompatibilité apparement
    Par stephane eyskens dans le forum Flash
    Réponses: 8
    Dernier message: 17/09/2003, 14h51

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