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

 C++ Discussion :

Gestion simple de thread


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Par défaut Gestion simple de thread
    Bonjour,

    Voici la structure de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void AuClicSurQLabel() {
    Arecuperer = Uneautreclasse::algotreslong();
    MAJ(Arecuperer); //Met à jour le QLabel ave le QLabel avec les infos de Arecuperer
    }
    Le problème c'est que l'algo est long, et du coup je me retrouve avec une fenêtre qui ne répond pas...
    Je sais qu'il y a une histoire de thread mais je ne n'arrive pas à maitriser le concept...
    AuClicSurQLabel() est une méthode héritée d'un QWidget donc elle doit être executé par le thread GUI ? J'aimerai libérer ce thread le temp de l'algo pour que la fenêtre ne bug pas, comment s'y prendre ?

    Merci beaucoup pour votre aide !

    Félix.

    Edit : J'utilise Qt si ça peut simplifier des choses...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ce qu'il faut faire, c'est un truc comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void AuClicSurQLabel() {
    	DemarrerUnNouveauThread(Uneautreclasse::algotreslong())
    }
     
    void AlgoTresLongFini(Arecuperer) {
    	MAJ(Arecuperer); //Met à jour le QLabel ave le QLabel avec les infos de Arecuperer
    }
    Ensuite, j'ignore ce que QT offre pour qu'un thread (GUI ou non) prévienne un thread GUI.
    L'API Windows offre PostMessage()/SendMessage(), .Net possède Control::Invoke()/BeginInvoke(), QT possède probablement un truc similaire à l'un ou l'autre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Par défaut
    Merci !!
    J'aimerais pouvoir essayer pour dire si ça marche mais j'ai encore une erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         std::thread t1(pointeurSurFenetre->lanceAlgo);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::thread t1(MainWindow::lanceAlgo);
    Me renvoient
    erreur : C3867: &'MainWindow::lanceAlgo'ÿ: liste d'arguments manquante dans l'appel de fonctionÿ; 
    utilisez 'MainWindow::lanceAlgo' pour créer un pointeur vers membre
    Alors que lanceAlgo ne prend pas d'arguments...

    (j'ai suivi le modèle donné ici par ex : http://www.baptiste-wicht.com/2012/0...start-threads/ )

    Edit : Bon ça c'est résolu... Il faut mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::thread t1(&MainWindow::lanceAlgo, pointeurSurFenetre);
    On va voir si ça marche pour le reste... Merci !

  4. #4
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Par défaut
    Malheureusement, ça ne marche pas...

    L'algo a le temps de tourner un tout petit peu puis j'ai une alert "abort has been called" comme si arrivé à la fin de la fonction ClicSurLabel il mettait fin à tous les threads ?

  5. #5
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Ton thread est détruit avant qu'il finisse son calcul. Tu peux utiliser la méthode .join() pour attendre la fin du thread. (Selon ton code, tu auras peut être besoin de déclarer ton thread dans le bloc d'avant.)

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 6
    Par défaut
    Merci pour ta réponse,

    Le problème c'est que je ne veux justement pas synchroniser (mettre un join()), je récapitule la structure actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class qui gère laffichage {
       void auClic() {
       thread t1(&MainWindow::lanceAlgo, pointeurSurFenetre);
       // Je veux sortir au plus vite de cette fonction car tant qu'on reste dedans : sablier de chargement puis ne répond pas.
       }
     
       void lanceAlgoFini() {
      // MAJ l'affichage...
       }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class MainWindow {
       void lanceAlgo() {
       // des calculs...
       Affichage->lanceAlgofini()
       }
    };
    Si je rajoute t1.join() juste après sa déclaration ça revient exactement à ce que je fais avant sans les threads

  7. #7
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    (Selon ton code, tu auras peut être besoin de déclarer ton thread dans le bloc d'avant.)
    Apparemment tu es dans ce cas là. Dans ton exemple, tu dois déclarer le thread comme attribut de ta classe.
    Tu devras faire le .join() sur le thread uniquement au dernier moment (dès que tu seras obligé d'attendre la fin du thread afin de faire autre chose).

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut-être ne devrais-tu pas mettre ton objet thread sur la pile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Je pense que le thread est très bien sur la pile (mais dans un bloc plus haut).
    Si ton thread est autonome, tu peux aussi utiliser .detach().

Discussions similaires

  1. Gestion d'un Thread
    Par mimi51340 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 12/06/2008, 10h07
  2. Gestion evennement dans thread séparé
    Par arcan2z dans le forum C#
    Réponses: 4
    Dernier message: 21/05/2008, 16h14
  3. [MediaWiki] Cherche Wiki avec gestion simple des utilisateurs
    Par aktos dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 25/11/2007, 15h11
  4. [Thread] Gestion de plusieurs thread
    Par be_tnt dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 14/07/2006, 13h35
  5. Gestion d'un thread aux boutons
    Par arsenik7 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 02/06/2006, 12h01

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