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 :

[Thread] Synchronisation d'un QThread avec l'IHM


Sujet :

Multithreading

  1. #1
    Membre actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut [Thread] Synchronisation d'un QThread avec l'IHM
    Bonjour à tous,

    je voulais savoir comment synchroniser un QThread avec l'IHM.
    j'ai un thread qui tourne en permance et qui récupère des données que je dois afficher dans un edit d'une fenetre.

    Ca fonctionne un petit moment et apres ca plante normale vue que je n'ai pas de synchro ... sous C++ builder il y a une fonction Synchronize(&fonction);.
    Mais avec Qt que dois-je utiliser

    Merci

  2. #2
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Salut,

    Qu'entends-tu exactement par synchroniser stp? Je ne connais pas C++B (ça remonte à trop loin, et je n'avais pas touché à ça à l'époque )

  3. #3
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Si j'ai bien interprété le sens de la synchronisation, je pense qu'il faut que tu communiques entre tes deux threads par les signals/slots. Inspire toi de l'exemple sur Mandelbrot.

  4. #4
    Membre actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut
    oula oui en effet c'est un peu plus compliqué !

    Donc ils y apparement plusieurs notions :
    -Qmutex
    -QWaitCondition
    -Signal et SLOT

    Il faut faire apparement la connexion avec ces derniers (qui ont apparement les mêmes paramêtres) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    connect(&thread, SIGNAL(renderedImage(const QImage &, double)),
                 this, SLOT(updatePixmap(const QImage &, double)));
    mais j'ai un peu de mal à comprendre comment fonctionne le tout...

  5. #5
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Si tu veux comprendre les signaux et slots regarde ce tutoriel sinon il y a aussi une page dans la doc Qt.

  6. #6
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Attention, j'ai vu que cfdev avait posté le lien vers la doc de Qt3.3. Si tu utilises cette version (en fait toutes celles <Qt4), la seule méthode de communication est par événement.
    Bien sûr, il est toujours possible d'accèder aux données du thread, par des accesseurs utilisant des mutex pour protéger d'éventuelles corruptions.

  7. #7
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Désolé j'avais pas vu, donc la doc sur le sujet en Qt 3 est plutôt celle là.

  8. #8
    Membre actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut
    Bien sûr, il est toujours possible d'accèder aux données du thread, par des accesseurs utilisant des mutex pour protéger d'éventuelles corruptions.
    Ha donc pour accéder au donnée de mon thread sans créer de corruptions (surement de multiples accés) est d'utiliser les mutex ?

    Exemple un peu concret que je voudrais réaliser sans créer d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonIHM->edit->setText ( monThread->myValue );
    ca ciblerait un peu mes recherches merci.

  9. #9
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Dans ce cas, il te faut un accesseur pour myValue, accesseur qui utilisera un QMutex pour protéger les accès concurents à la dite variable:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class MonThread : public QThread
    {
    public:
       MaClasse QThread::getMyValue() const
       {
          QMutexLocker locker(&myValueMutex);
          return myValue;
       }
     
    protected:
       void run()
       {
          // ... tout un tas de choses
          myValueMutex.lock();
          myValue.uneActionTransformatrice(leParam);
          myValueMutex.unlock();
          // ... tout un tas d'autres choses
          myValueMutex.lock();
          myValue.uneActionTransformatrice(unAutreParam);
          myValueMutex.unlock();
          // ... le dernier tas d'autres choses :)
       }
     
    private:
       QMutex myValueMutex;
       MaClasse myValue;
    };
    Bien sûr c'est un exemple très basique, mais j'espère que ça te fournit l'idée sur l'utilisation des mutex et mutexlocker (un "wrapper" pour mutex qui respecte le RAII)

  10. #10
    Membre actif Avatar de cfdev
    Homme Profil pro
    Passionné
    Inscrit en
    Octobre 2004
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Passionné

    Informations forums :
    Inscription : Octobre 2004
    Messages : 220
    Points : 210
    Points
    210
    Par défaut
    Ok merci, je vais me pencher donc sur les mutex,
    par contre on m'a parler de QSemaphore ?!

  11. #11
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Ca a une autre utilité que QMutex:
    A semaphore differs from a mutex, in that a semaphore can be accessed by more than one thread at a time.
    En gros, il faut utiliser l'un ou l'autre selon le besoin précis. Sans plus d'infos on ne pourra te guider davantage

    Edit: en gros, si tu veux que ta donnée ne soit accessible que par un et un seul thread à un instant t, il te faut un mutex. Si tu veux que ta donnée soit accessible par un ou plusieurs thread à un instant t (le nombre étant défini une fois pour toute à l'instanciation), un sémaphore fera l'affaire.

  12. #12
    Membre actif Avatar de ttone
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    589
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 589
    Points : 203
    Points
    203
    Par défaut
    Flag!

    Je vais transformer une boucle sur K élément en K threads, ils sen partageront des données sans les modifier, et écriront chacun des données de noms différents.

    Je dois donc utiliser un sémaphore pour les données consultées ?

  13. #13
    Membre expert

    Avatar de IrmatDen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 727
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 727
    Points : 3 266
    Points
    3 266
    Par défaut
    Si aucun thread ne modifie les données (j'inclus le thread graphique), tu n'as pas besoin de sécuriser bien sûr.

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

Discussions similaires

  1. Thread Synchronisation avec structure FIFO ??
    Par vincedom dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2006, 07h00
  2. service NT avec interface (IHM)
    Par cash3000 dans le forum Windows
    Réponses: 14
    Dernier message: 06/06/2005, 10h23
  3. Réponses: 1
    Dernier message: 23/05/2005, 16h52
  4. [Thread] synchronisation globale
    Par guejo dans le forum Concurrence et multi-thread
    Réponses: 6
    Dernier message: 16/02/2005, 12h56
  5. [Thread][Synchronisation] Exclusion mutuelle
    Par masto dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 20/01/2005, 17h02

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