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 :

Rendez-vous en Qt


Sujet :

Multithreading

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    Points : 63
    Points
    63
    Par défaut Rendez-vous en Qt
    Bonjour à tous,

    J'ai une petite application avec beaucoup de threads de calculs (enfin 8, quoi... pour alimenter chacun des coeurs de mon 3770K tout neuf).
    En effet, l'appli que j'écris nécessite énormément de calculs sur des données facilement séparables en zones.
    Par contre, ces calculs se font en deux phases, et à chaque phase, il faut attendre que toutes les phases aient fini avant de passer à la phase suivante.
    Je veux donc créer deux Rendez-vous.

    Pour ce faire j'utilise deux QWaitCondition:
    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
     
    void Comportement::run()
    {
        for(;;)
        {
            Mutex1.lock();  // J'ai essayé sans les locks
            ... Taf de la phase 1 ....
            emit TerminatedPhase1(numThread);
            Condition1.wait(&Mutex1);
            Mutex2.lock();
           ... Taf de la phase 2 ...
            emit TerminatedPhase2(numThread);
            Condition2.wait(&Mutex2);
        }
     
    }
    et comme code des deux slots...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Pilote::MiseAJour1(int numThread)
    {
        Event1 |= 1<<numThread;
        if(Event1 == (1<<mNbThread) -1)
        {
            Event1 = 0;
            for(int i=0; i<mNbThread; i++)
                mComportement[i]->Condition1.wakeOne();
        }
    }
    Au bout de quelques passages (5 en general) l'un des threads ne redémarre pas en Phase 1...

    J'ai essayé evec une QWaitCondition static et un wakeAll... Pas mieux, là, c'est tout les threads qui se bloquent...
    Bref, je ne sais pas créer un rendez-vous en Qt?

    Comment feriez-vous? Merci d'avance.

  2. #2
    Membre averti

    Homme Profil pro
    Inscrit en
    Février 2010
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2010
    Messages : 243
    Points : 398
    Points
    398
    Par défaut
    Connais-tu le framework QtConcurrent, je pense que ça devrait t'aider.
    En particulier les classes QtConcurrentMap dans ton cas il me semble.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    Points : 63
    Points
    63
    Par défaut Rendez-vous... avec des Mutex!
    Je répond à ma propre question...

    Dans la classe de Thread, un Mutex (accessible)...

    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
     
    void Comportement::run()
    {
        Mutex1.lock();  
        Mutex2.lock();
        for(;;)
        {
            ... Taf de la phase 1 ....
            emit TerminatedPhase1(numThread);
            Mutex1.lock();  // Qui bloque le thread
           ... Taf de la phase 2 ...
            emit TerminatedPhase2(numThread);
            Mutex2.lock();  // Qui bloque le thread
        }
     
    }
    et comme code des deux slots...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Pilote::MiseAJour1(int numThread)
    {
        Event1 |= 1<<numThread;
        if(Event1 == (1<<mNbThread) -1)
        {
            Event1 = 0;
            for(int i=0; i<mNbThread; i++)
                mComportement[i]->Mutex1.unlock();
        }
    }
    Ca marche nickel. J'ai réglé le nombre de thread de calcul à QThread.idealThreadCount()-1 et j'arrive à 99% d'occupation du CPU (sur un 3770K) avec une accélération de 220% par rapport à un seule thread de calcul et 300% en monothread...

    Je passe en résolu.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2012
    Messages : 10
    Points : 15
    Points
    15
    Par défaut
    Bonjour,

    Juste pour information, quelle est le rôle d'une boucle par rapport à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; i avec condition; i++)
    par exemple ?

    Je vois très souvent ce code dans des exemples, mais j'avoue que je n'arrive pas à saisir l'utilité.

    Merci.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut
    Citation Envoyé par Sissroh Voir le message
    Bonjour,

    Juste pour information, quelle est le rôle d'une boucle par rapport à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0; i avec condition; i++)
    par exemple ?

    Je vois très souvent ce code dans des exemples, mais j'avoue que je n'arrive pas à saisir l'utilité.

    Merci.
    Cela permet de créer une boucle dont on ne sortira jamais.

    Le problème, c'est que j'ai du mal à imaginer une boucle dont on puisse réellement ne jamais sortir : tôt ou tard, il faudra bien en sortir pour une raison ou une autre, ne serait-ce que pour redémarrer un service ou un autre

    Je suis d'autant plus contre cette solution qu'une boucle for est, typiquement destinée à représenter une boucle incrémentielle (qui compte le nombre de passages effectués dans la boucle).

    Ceux qui utilisent cette technique feraient sans doute bien de se souvenir du fait qu'une boucle for n'est jamais qu'une boucle while avec un compteur (quel que soit le type réel du compteur) et qu'il pourraient donc tout à fait parvenir au même résultat avec une boucle while
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ceux qui utilisent cette technique feraient sans doute bien de se souvenir du fait qu'une boucle for n'est jamais qu'une boucle while avec un compteur (quel que soit le type réel du compteur) et qu'il pourraient donc tout à fait parvenir au même résultat avec une boucle while
    En fait, avec Qt, tu peux même faire mieux : forever (http://doc.qt.digia.com/qt/qtglobal.html#forever). C'est exactement la même chose, mais c'est plus explicite sur les intentions (non, c'est pas un for dont on a retiré la moelle parce que ça fonctionne soudain mieux – c'est fou le nombre de trucs du genre qu'on voit parfois ).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

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

Discussions similaires

  1. [MySQL] Calendrier avec gestion de rendez vous
    Par t-die dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/07/2012, 20h35
  2. 2 ou 3 tables pour la relation client rendez-vous
    Par ollivier dans le forum Schéma
    Réponses: 3
    Dernier message: 26/04/2006, 22h36
  3. Requête filtre sur des rendez vous
    Par jdotti dans le forum Outils
    Réponses: 5
    Dernier message: 17/03/2006, 15h41
  4. Rendez-vous Outlook depuis Access
    Par pascal@falcy.ch dans le forum Access
    Réponses: 4
    Dernier message: 03/10/2005, 21h59

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