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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    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 expérimenté

    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 67
    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.

+ 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