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 :

QWaitCondition sans QMutex ? [QThread]


Sujet :

Multithreading

Vue hybride

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

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut QWaitCondition sans QMutex ?
    Bonjour,

    j'ai plusieurs thread au sein d'un même programme qui effectuent des tâches totalement différentes les unes des autres. Les thread sont asynchrones entre eux, c-à-d qu'on ne peut pas prévoir (sauf avertir via les signaux) quand un thread va rendre le résultat de son exécution à un autre thread pour que lui même effectue un travail dessus.

    Etant donné que l'exécution de mes thread est asynchrone, j'utilise les signaux pour envoyer les informations entre les thread (pointeurs d'objets) et je fais appel à start() afin de relancer la méthode run() du thread adéquat qui contient l'algorithme de traitement (qui ne boucle pas indéfiniment jusqu'à une demande de terminaison de thread ou jusqu'à une certaine condition).

    Donc pour l'instant mes threads (pas tous) s'exécutent, renvoient les résultats via les signaux, meurent, et son relancés par la méthode start(), autant de fois qu'un traitement est à effectuer.

    Vu que je n'ai pas besoin de mutex, parce que je n'ai pas d'accès concurrent à une même donnée, je n'ai pas l'utilité de QWaitCondition qui demande un QMutex.

    Comment puis-je réveiller ou mettre en attente les thread jusqu'à ce qu'il reçoivent l'ordre de s'exécuter ?

    J'essaye aussi d'éviter qu'un thread prenne du temps CPU pour rien, ou quoi que ce soit d'autre qui serait du temps perdu, parce que la machine sur laquelle s'exécutera le programme est doté d'un P4 1Go RAM DDR2 --'.

    Merci à tous !

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.

    j'utilise les signaux pour envoyer les informations entre les thread (pointeurs d'objets)
    To envoie des pointeurs par des signaux entre les thread ?
    Tu n'utilise pas d'eventloop dans les thread ?

    Un peu de lecture
    http://qt-labs.developpez.com/thread...-movetothread/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut
    To envoie des pointeurs par des signaux entre les thread ?
    Ouai j'ai rien trouvé de mieux pour échanger des informations entre thread.

    Tu n'utilise pas d'eventloop dans les thread ?
    Ya quasiment rien sur le net qui explique concrètement l'utilité de l'eventloop ainsi que son fonctionnement, du coup non je n'en utilise pas dans mes thread.
    Quand on cherche Tuto Qt sur le net on tombe à 98% sur de l'interface graphique, d'ailleurs ce sont souvent les même tutos recopiés ou traduits...

    Et la petite lecture je l'ai déjà faite...

    Merci Yan

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par alexgille Voir le message
    Ouai j'ai rien trouvé de mieux pour échanger des informations entre thread.
    Ce sont de gros objet que tu envoie? il faut faire très attention à la durée de vie de tes pointeur. Sinon autant ne pas utiliser de pointeur.

    Si tu n'as pas d'eventloop comment tu fait pour envoyer un objet d'un thread à l'autre? Si c'est en ajoutant un slot sur le QThread, il faut savoir que le QThread n'est que l'interface d'un thread et s’exécute pas dans ce thread. Donc le slot n'est pas exécuté dans le thread (sauf si t'as utilisé movetothread sur le QTHread. Ce qui n'est pas bien)

    Es ce que tu peux expliquer un peu ce que tu cherche à faire?

    As tu regardé les exemple de sur QSemahore et QWaitCOndition?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut
    Ton histoire d'eventloop m'intéresse pour les histoire de signaux/slots et d'attente bloquante...
    Si tu pouvais me faire part de ta science sur les thread et les eventloop ça serait cool !

    Merci !

    L'objet envoyé via les signaux est un pointeur vers une classe qui contient essentiellement un tableau de 10millions de double. Je fais très attention à mes pointeurs, je sais le dangers que ça représente...

    Si tu n'as pas d'eventloop comment tu fait pour envoyer un objet d'un thread à l'autre?
    Comme tu le dis, je fais un signal d'un côté, un slot de l'autre, avec un slot qui effectue des initialisations de pointeur avant le lancement du thread.

    J'ai fais des thread comme j'ai pu, malgré que ce soit barbare, il n'y a presque aucun tuto qui explique comment bien implémenter un petit programme multithreadé utilisant les signaux/slot etc etc...

    Je t'explique le fonctionnement du programme.

    - J'ai un thread qui doit faire une acquisition de donnée sur une carte PCI.
    - Une fois que ce thread reçoit une impulsion de la carte PCI, il envoi le pointeur du buffer à un second thread qui s'occupe de stocker les données dans une file d'attente (FIFO).
    - Dès qu'il le peut, ce thread de stockage sort un un buffer de sa file d'attente et l'envoi au thread d'analyse qui analyse la courbe acquise avec la carte PCI.
    - Une fois que le thread d'analyse a terminé son analyse, il renvoi le pointeur d'un objet (Pulse) au thread de stockage.
    - Lorsque le thread de stockage reçoit ce pointeur d'objet, il effectue des opérations sur l'objet reçu, supprime l'objet, puis ressort un buffer dans sa file d'attente si il le peut et l'envoi au thread d'analyse.
    - Si la liste d'attente est vide, le thread de stockage attend l'instruction de stockage d'un nouveau buffer.
    - Le thread de stockage attend indéfiniment un nouveau à stocker et à envoyer au thread d'analyse.
    - Le thread d'analyse attend un buffer à analyser. Il peut se terminer puis se relancer, ou attendre indéfiniment jusqu'à la terminaison du programme.

    Voili voulou.

    Merci !

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Alors ce que je te propose :
    1- vire ce pointeur de tes signaux et utilise soit un QSharedPointeur soit pas de pointeur du tout
    2-remplace tes thread par des QObject et fait fonctionner le tout sans thread avec des échange par signal/slot.Tes classe peuvent utiliser l'eventloop si besoin(Tu peut utiliser starttimer pour cela)
    3- quand tout marche instancie des QThread(exécute une eventloop par defaut) et applique des movetothread sur tes QObject.

    Tu doit surement pouvoir regrouper certain QObject dans un même thread. Attention au accès concurrent s'il y en as.

    j'ai commencer un article sur le thème. y as pas mal de faute d'ortho mais l'article est sur la fin. Si cela peut t'aider.
    http://yan-verdavaine.developpez.com/wiki/doku.php

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Par défaut
    QObject permet l’exécution de deux portion de code en parallèle ?

    L'acquisition sur la carte ne peut pas être suspendu en attendant la fin de l'analyse...
    A vrai dire je ne sais pas trop comment fonctionne QObject...

    En plus j'ai pas d'accès concurrent aux données, le truc qui m'importe c'est que l'acquisition soit exécutable en parallèle de l'analyse des courbes acquises.

    Mais merci pour tes réponses !

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

Discussions similaires

  1. Comment récupérer le nom du fichier sans l'extension ?
    Par altahir007 dans le forum Langage
    Réponses: 16
    Dernier message: 13/11/2009, 13h20
  2. [TP]Compiler un prog sans entrer dans TP7
    Par poppels dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 23/10/2002, 18h46
  3. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  4. [Kylix] Fiches sans bordure
    Par alex dans le forum EDI
    Réponses: 4
    Dernier message: 28/04/2002, 21h19

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