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

  1. #21
    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
    Pour l'acquisition je peux pas, les fonctions du SDK de la carte PCI sont en boucle infinie...
    De plus je vois mal comment attribuer plusieurs QObject à un seul QThread, plutôt comment jongler entre les QObject pour qu'ils soient tous utilisables en même temps.

  2. #22
    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
    Pour l'acquisition je peux pas, les fonctions du SDK de la carte PCI sont en boucle infinie...
    Tu peux utilise startTimer et la focntion voidtimerEVent(...) pour simuler la boucle infinie.

    Citation Envoyé par alexgille Voir le message
    De plus je vois mal comment attribuer plusieurs QObject à un seul QThread, plutôt comment jongler entre les QObject pour qu'ils soient tous utilisables en même temps.
    C'est levent loop qui permet de partager la thread.
    Il faut bien comprendre que le thread ne s'exécute par réellement en parallèle mais elle partage les ressources CPU. Et ca peux devenir très casse tête si on ne fait pas attention . Par exemple un thread peux se retrouver à monopoliser tous le CPU et les autre thread attende indéfiniment.

  3. #23
    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
    Sauf que là, si mon second thread est occupé avec le QObject d'analyse, le traitement de la file d'attente ne se fera pas, vu que le thread est occupé .. je me trompe ?

    Normalement il n'est pas possible qu'un thread monopolise le CPU si il a une priorité normal parce que le CPU attribut des quantum de temps définis aux processus .. je me trompe encore ?

    Merci pour ton aide

  4. #24
    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
    Sauf que là, si mon second thread est occupé avec le QObject d'analyse, le traitement de la file d'attente ne se fera pas, vu que le thread est occupé .. je me trompe ?
    Disons que le QThread ne peux exécuter qu'un slot à la fois. Vue tes explications tes QObject font des actions assez courte lorsqu'un signal est emit. Il devrais donc pouvoir facilement se partager un QThread. SI ca te semble plus simple commence par un QThread par QObject.

    Normalement il n'est pas possible qu'un thread monopolise le CPU si il a une priorité normal parce que le CPU attribut des quantum de temps définis aux processus .. je me trompe encore ?
    créé un thread qui exécute
    et tu verra ce qui se passe

    Quand un signal est emis et que ton slot est dans un autre thread il se passe ceci :
    1- copie des paramètres
    2- ajout d'un event dans l'eventloop du thread pour éxécuter le slot.

  5. #25
    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
    A ce moment là mon QThread va contenir l'algo à exécuter et le QObject les signaux/slots utiles pour le QThread exécuté c'est ça ?

    Mais comment faire pour faire cohabiter 2 algorithmes différent et différentes données dans un même QThread ? L'algorithme doit être placé dans le QObject ?

    Une fois le QObject lié au QThread, comment on fait appel aux différentes données ?

  6. #26
    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
    A ce moment là mon QThread va contenir l'algo à exécuter et le QObject les signaux/slots utiles pour le QThread exécuté c'est ça ?
    Qthread ne contiens rien. Tu n'as même pas besoin de le speciaiser. Par défaut QThread exévute une eventloop.

    Mais comment faire pour faire cohabiter 2 algorithmes différent et différentes données dans un même QThread ? L'algorithme doit être placé dans le QObject ?

    Une fois le QObject lié au QThread, comment on fait appel aux différentes données ?
    Tout est définie dans tes QObject.
    Pour la cohabitation, ca depend de ce que font tes algo et de ce qui ne doit pas être bloqué.

  7. #27
    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
    Je vois où tu veux en venir, j'ai juste à exécuter la méthode de mon QObject dans l'eventloop du QThread.

    Les signaux sont-ils queués ? Si c'est le cas ça résout mon problème car tant que le signal est interprété par le thread de stockage puis envoyé au thread d'analyse, que ce soit en direct, ou en différé via une FIFO ça effectue le travail demandé ...

    Pour mettre 2 objets dans le même QThread je fais 2 moveToThread consécutif ?

  8. #28
    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
    Je vois où tu veux en venir, j'ai juste à exécuter la méthode de mon QObject dans l'eventloop du QThread.

    Les signaux sont-ils queués ? Si c'est le cas ça résout mon problème car tant que le signal est interprété par le thread de stockage puis envoyé au thread d'analyse, que ce soit en direct, ou en différé via une FIFO ça effectue le travail demandé ...
    dans notre cas oui.


    Citation Envoyé par alexgille Voir le message
    Pour mettre 2 objets dans le même QThread je fais 2 moveToThread consécutif ?
    sur chaque QObject

  9. #29
    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
    Dans le cas où les deux QObject dans le QThread n'aurait rien à faire, que ce passe-t-il ?

    Dans mon cas, il faut alors que mes fonctions d'analyse et de stockage soient appelées directement dans le slot ?

  10. #30
    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
    Dans le cas où les deux QObject dans le QThread n'aurait rien à faire, que ce passe-t-il ?
    l'eventloop se met en attente.

    Dans mon cas, il faut alors que mes fonctions d'analyse et de stockage soient appelées directement dans le slot ?
    je pense oui.

  11. #31
    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
    Ok merci !

  12. #32
    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
    Me revoilà avec quelques questions

    J'ai deux thread comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class BufferStore : public QThread {
       signals:
          doJob(Pulse*);
       public slots:
          valuesReturned(Pulse*);
          storeRawValues(f64*);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class PulseFinder : public QThread {
       public:
         run();//pour l'instant msleep(100);
       signals:
         done(Pulse*);
       public slots:
         giveMeAJob(Pulse*);
    }
    Mon objet qui fait le va et vient entre les thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Pulse {
        f64 * buffer;
        void savePart();
    }
    Et les connexions entres les QThread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    acquisitionThread::toBufferStore(f64*) <--> BufferStore::storeRawValues(f64*)
    BufferStore::doJob(Pulse*) <--> PulseFinder::giveMeAJob(Pulse*)
    PulseFinder::done(Pulse*) <--> BufferStore::valuesReturned(Pulse*)
    Lorsque je stress un peu mon programme j'arrive à un problème ..
    Le Pulse* envoyé à partir de BufferStore va bien dans PulseFinder et revient bien vers BufferStore en suivant le trajet des signaux que j'ai créé.
    Le problème réside dans le fait que, une fois que PulseFinder renvoi à BufferStore le Pulse* et que BufferStore appel savePart() sur l'objet Pulse (dans le slot), il y a des fois (souvent) où le fichier n'est pas enregistré sur le disque.
    On dirait que l'appel à savePart() est fait, mais que le thread stop son exécution faute de temps, ou à cause d'un nouvel appel du slot .. je ne sais pas.

    Compte tenu du faite que je sois obligé de passer par des QObject que j'assignerai tous les deux dans un même QThread afin que les signaux/slots soient exécutés correctement et sachant que mon PulseFinder a une fonction à exécuter, comment puis-je faire pour que l'eventloop du QThread dans lequel vivra les 2 QObject BufferStore et PulseFinder (qui sont actuellement QThread) exécute la fonction du PulseFinder, les signaux et les fonctions appelées par les signaux, à intervalle régulier sans perte ?

    Merci !

  13. #33
    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
    On dirait que l'appel à savePart() est fait, mais que le thread stop son exécution faute de temps, ou à cause d'un nouvel appel du slot .. je ne sais pas.
    Il n'y as aucune raison pour le thread se stop faute de temps ou auter.

    Pour ton problème de sauvegarde, sans code, difficile de t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    à intervalle régulier
    C'est à dire?

  14. #34
    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
    Un système attribut des quantum de temps à ses processus et donc aux thread de mon programme.
    Vu que là, dans mon thread, j'aurai deux QObject avec chacun son lot de petites fonctions à exécuter, l'eventloop du QThread dans lequel vivra ces 2 QObject fera l'attribution de quantum aussi ? Sinon qu'est-ce qu'elle fera ?
    En faite je cherche à savoir comment manipuler l'eventloop afin que les signaux soient bien interprétés et surtout que mon PulseFinder puisse exécuter sa fonction d'analyse lorsqu'il le faut.

    Pour le problème des fichiers j'ai trouvé la solution (je crois). Comme j'enregistre les fichiers avec en nom la date et l'heure, si deux fichiers sont enregistrés dans la même seconde, l'un écrase l'autre .. c'est tout bête.

  15. #35
    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
    Je n'ai rien compris...

    Pourquoi l'eventloop devrais faire disparaître l'appel à certain slot??

  16. #36
    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
    On va faire plus simple xD

    Avant:

    Moi avoir 2 QThread.
    Chaque QThread avoir slots qui font appels à des fonctions sur des Objets (de ma propre création ).
    Chaque QThread avoir run() et exécuter son propre run() avec algo de traitement dedans x).
    Paske moi vouloir faire exécution parallèle !

    Après passage de l'homme sage (toi :p) sur mon code:

    Moi avoir 2 QObject à la place et plus qu'un seul QThread !
    Moi pas savoir comment faire pour mettre 2 QObject dans seul QThread en utilisant eventloop !
    Moi pas savoir comment demander à seul QThread d'exécuter ce qui était AVANT dans les run() des deux QThread :o

    Tarzan aime banane !

  17. #37
    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
    C'est un peu plus claire ^^

    Citation Envoyé par alexgille Voir le message
    Moi pas savoir comment faire pour mettre 2 QObject dans seul QThread en utilisant eventloop !
    Ben c'est moveToThread

    Citation Envoyé par alexgille Voir le message
    Moi pas savoir comment demander à seul QThread d'exécuter ce qui était AVANT dans les run() des deux QThread
    Ton "run" deviens ton slot, c'est tous

    Si ton slot et ton signal sont dans 2 thread différent, l’exécution du slot utilisera l'eventloop pour s'exécuter dans le bon thread. Tu n'as rien à faire de plus qu'un connect.

    Tu pourra voir après si tu as besoin d'ajouter d'autre QThread pour équilibrer ce que tu appel "exécution parallèle".

  18. #38
    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
    Autre question..

    Ma fifo dans mon thread de stockage doit-elle être Mutexée ?

    Je pose cette question car je ne sais pas si le slot qui envoi le pointeur en tête de file et le slot qui reçoit les données traitées peuvent s'exécuter quasi simultanément et provoquer un accès concurrent.

    Merci

  19. #39
    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
    Autre question..

    Ma fifo dans mon thread de stockage doit-elle être Mutexée ?

    Je pose cette question car je ne sais pas si le slot qui envoi le pointeur en tête de file et le slot qui reçoit les données traitées peuvent s'exécuter quasi simultanément et provoquer un accès concurrent.

    Merci
    Comme cela, je dirai qu'il y as un risque et donc oui il faut protéger.

    Si tu émet ta donnée, y as t'il une raison d'avoir la FIFO?

  20. #40
    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
    Oui parce que la quantité de travail est variable et le thread de stockage peut se remplir plus vite qu'il ne se vide en émettant vers le thread d'analyse.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

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, 14h20
  2. [TP]Compiler un prog sans entrer dans TP7
    Par poppels dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 23/10/2002, 19h46
  3. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 08h38
  4. [Kylix] Fiches sans bordure
    Par alex dans le forum EDI
    Réponses: 4
    Dernier message: 28/04/2002, 22h19

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