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. #41
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alexgille Voir le message
    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.
    Y as plusieurs objet qui accèdent à la FIFO?

  2. #42
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Non seul le thread touche à la FIFO au début pour y ajouter le buffer et fait un pop() pour retirer l'objet et le détruire.

    J'ai fais une classe héritée de QThread pour héberger mes QObject.

    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
    #ifndef THREADHOUSE_HXX
    #define THREADHOUSE_HXX
    #include <QThread>
    #include "application.hxx"
     
    class Application;
     
    class AcquiThread : public QThread
    {
        Q_OBJECT
     
    private:
        Application * parent;
     
    public:
        AcquiThread(Application *, QObject *);
        ~AcquiThread();
     
    protected:
        void run();
     
    };
     
    #endif // ACQUITHREAD_HXX
    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
     
    #include "acquithread.hxx"
    #include "application.hxx"
     
    AcquiThread::AcquiThread(Application * _parent, QObject * guest) : parent(_parent)
    {
        /* ------ Assignation des objets ----- */
        //Les objets vivent maintenant dans ce thread
        guest->moveToThread(this);
    }
     
    AcquiThread::~AcquiThread() {}
     
    void AcquiThread::run() {
        exec();
    }
    cela te parait bon ?

  3. #43
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alexgille Voir le message
    Non seul le thread touche à la FIFO au début pour y ajouter le buffer et fait un pop() pour retirer l'objet et le détruire.
    si la FIFO est accédé par un seule thread, y as pas besoin de mutex.
    Par contre si tu le détruit, les slot récepteur vont se retrouver avec un pointeur invalide et crasher ton appli :/
    Le top c’est de mettre tes objet popé dans un QSharedPointeur et c'est ce que tu envoye. Là plus de problème sur le delete, il se fera automatiquement.



    Citation Envoyé par alexgille Voir le message
    cela te parait bon ?
    oui.
    Pas besoin de réimplémenter le run, c'est déjà ce qu'il fait
    Si c'est intéressant, tu peut aussi instancier tes QObject dans le run. Comme cela il n'y as pas besoin de moveToThread.

    Dans la plupart des cas, je ne reimplémente pas QThread. Je l'utilise telle quel.
    J'utilise alors moveToTHread pour déplacer certain QObject dans un thread précis pendant l'éxécution.

  4. #44
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Ok je vois. Merci pour tes infos

    Maintenant passons à autre chose :p

    Je viens de faire le tour de toutes mes lignes de code à la recherche d'une éventuelle fuite de mémoire.
    Tous mes destructeurs suppriment les objets instanciés dynamiquement.
    Tous mes pointeurs sont détruis à la fin.

    Mais seulement j'ai surveillé la mémoire que pompe le logiciel en stress test (simulation d'acquisitions de 20 impulsions à la suite) et j'ai remarqué que la taille augmentait au fur et à mesure.

    D'un côté c'est normal vu que l'interface graphique (QTableWidget) ajoute une ligne d'informations par impulsion (donc 20 à chaque lancement).
    Ce que je comprend moins, c'est pourquoi la taille redescend de façon peu significative lorsque je supprime la totalité du contenu de ce QTableWidget avec removeRow(int).

    De plus à chaque appel de setStatusTip() sur mon QMainWindow je vois la taille augmenter, mais jamais diminuer ..
    Idem pour mon setStatusBar() dans lequel vis un QLabel, sur lequel je fais un setText().

    EDIT: Dans la statusBar il y a un QLabel sur lequel je fais un setText().

  5. #45
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Augemente de quelle manière?
    Beaucoup? Un peu?
    Faut faire attention à l'interprétation de ce que te fournie windows

  6. #46
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Quand je lance une simulation de 20 impulsion, je vois une augmentation de 400ko, des fois 200ko, des fois moins, des fois plus, ça varie.
    Parcontre que je removeRow(), aucun changement ..


    J'ai remarqué que passer du mode Debug au mode Release faisait diminuer la taille du processus de 10Mo.

  7. #47
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alexgille Voir le message
    Quand je lance une simulation de 20 impulsion, je vois une augmentation de 400ko, des fois 200ko, des fois moins, des fois plus, ça varie.
    Parcontre que je removeRow(), aucun changement ..


    J'ai remarqué que passer du mode Debug au mode Release faisait diminuer la taille du processus de 10Mo.
    Qt faut pas mal d’optimisation en interne et garde certaine chose en mémoire pour ne pas les réallouer ensuite. Vue ce que tu dit y as rien de choquant.

    Si tu peux compiler sous linux, il y as valgrind qui pourrai détecter si tu as vraiment une fuite mémoire.

  8. #48
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Les memory leaks sont d'autant plus dangereux que le logiciel que je programme va tourner sur une machine h24/7 pendant plusieurs semaines d'affilés, sans nettoyage ni rien.

    Il s'agit en faite de mon projet de fin de licence. Je programme un logiciel d'acquisition de signaux électromagnétiques liés à la foudre. Lui se base sur ces données pour faire ses recherches, et il fera tourner ce logiciel sur 3 machines, géographiquement éloignées, sans accès à distance, sans accès quotidien possible.

    Et pour gratiner le tout, il utilise une vieille daube en P4 1Go DDR2 sous XP ..

  9. #49
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    As tu essayé de le faire tourner plusieur heure et voir si la mémoire stagne?

  10. #50
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par yan Voir le message
    Qt faut pas mal d’optimisation en interne et garde certaine chose en mémoire pour ne pas les réallouer ensuite. Vue ce que tu dit y as rien de choquant.

    Si tu peux compiler sous linux, il y as valgrind qui pourrai détecter si tu as vraiment une fuite mémoire.
    Ok. De toute façon il veut compiler sous Linux. Si j'ai utilisé la lib Qt dans tout mon programme, il n'y a aucun risque de problème à la compilation propre à la plateforme Linux ?

  11. #51
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par yan Voir le message
    As tu essayé de le faire tourner plusieur heure et voir si la mémoire stagne?
    Bah en faite, on a toujours pas terminé la partie qui paramètre la carte PCI et qui fait l'acquisition .. donc là je fais des simulations.

  12. #52
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alexgille Voir le message
    Ok. De toute façon il veut compiler sous Linux. Si j'ai utilisé la lib Qt dans tout mon programme, il n'y a aucun risque de problème à la compilation propre à la plateforme Linux ?
    Non, Le code de QT est multi plateforme. C'est plutôt la syntaxe C++ qui peux parfois faire quelques erreur entre gcc et visual. Mais c'est trés rapide à modifier.

  13. #53
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 112
    Points : 90
    Points
    90
    Par défaut
    J'utilise Qt Creator et je code en C++ le plus optimisé possible.

  14. #54
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par alexgille Voir le message
    J'utilise Qt Creator et je code en C++ le plus optimisé possible.
    SI tu utilise mingw, y as de forte chance que 'tu n'ai aucun problème sous linux car c'est" le même" compilot

  15. #55
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ?

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

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