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 :

Conseils de conception pour traitement d'image [QThread]


Sujet :

Multithreading

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Conseils de conception pour traitement d'image
    Bonjour à tous,

    Je développe actuellement un petit projet permettant d'effectuer des filtres/transformations sur une image.

    J'ai pour l'instant un QWidget contenant un QPixmap qu'on appellera QImageWidget, une GUI, un manager de thread et une classe de thread de calcul contenant les opérations a effectuer sur l'image.

    Le QImageWidget est intégré dans la GUI permettant d'afficher en temps réel l'image, le manager est lui-même threadé pour ne pas bloquer l'interactivité de la GUI (zoom, scrolling, boutons d'interface, ...) et il permet de gérer dynamiquement le nombre de threads, de générer des signaux start stop pause resume aux threads de calculs.
    La thread de calcul reçoit l'image ainsi que la portion d'image à calculer et renvoie le résultat pour qu'il puisse être pris en compte pour la suite des calculs.

    J'ai fréquemment des blocages et des plantages d'application dûs au retour de données par les threads de calcul.

    Pensez-vous que cette façon de faire est la bonne?
    Auriez-vous des pistes/solutions pour m'aider à obtenir un résultat correct?

    Merci d'avance!

  2. #2
    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
    Salut.
    Citation Envoyé par Kirozen Voir le message
    Pensez-vous que cette façon de faire est la bonne?
    Ca me semble tout à fait correcte.

    Auriez-vous des pistes/solutions pour m'aider à obtenir un résultat correct?
    Utilise tu les signal/slot pour transmettre l'image entre la GUI et les threads?
    as tu utilisé des pointeur pour le paramètre de tes signaux/slots?
    Utilise tu des QImage dans les threads?

    Sans bout de code ca va être difficile d'en dire plus...

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut yan,

    L'image est gérée par le manager, j'utilise des signaux pour la passer vers la GUI et vers les threads, les slots n'étant apparemment pas thread-safe.

    L'image qui transite est effectivement un QImage.

    j'ai mis le code source en fichiers attachés, plus celui du dessous et normalement y a tout le code utile :-)

    Pour le moment je fais juste de la génération d'image avec une couleur aléatoire.

    rendermanager.hpp
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    #ifndef RENDERERMANAGER_H
    #define RENDERERMANAGER_H
     
    #include <QMutex>
    #include <QSize>
    #include <QThread>
    #include <QWaitCondition>
    #include <QImage>
     
    class RenderChild;
    class Block;
     
    class RendererManager : public QThread
    {
        Q_OBJECT
     
    public:
        RendererManager(QObject *parent = 0);
        ~RendererManager();
     
        void process(const size_t nOfThreads, const QImage& image);
     
    public slots:
        void pauseProcess();
        void stopProcess();
        void incThreads();
        void decThreads();
        void refreshPixmap();
        void childFinished();
     
    signals:
        void sendBlock(const Block &block);
        void manager_up(const QString& data);
        void renderedImage(const QImage image);
        void startChildsCalc();
     
    protected:
        void run();
     
    private:
        void initChilds(int nb);
        void firstAssignator();
     
    private:
     
        QMutex mutex;
        QWaitCondition condition;
        bool terminate;
        bool running;
        bool pause;
        QImage image;
        int threadRndSeed;
        int currentline;
     
        QVector<RenderChild*> childs;
    };
     
    #endif
    Fichiers attachés Fichiers attachés

  4. #4
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    J'ai oublié de dire, dans le code on voit un signal sendblock, il est pas utilisé, c'est juste pour usage futur :-)

  5. #5
    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
    J'ai rien vue de choquant.

    Au lieu des lock et unlock, utilise des QMutexLocker.
    Pourquoi y as t'il une QImage partagé entre plusieurs thread?
    Si on copie ton code on peux le compiler et l'exécuter?

    Connais tu QtConcurrent?
    http://qt.developpez.com/doc/latest/qtconcurrent.html
    Car ça semble très bien correspondre à ce que tu veux faire.

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Pour la QImage partagée, en fait je sais pas pourquoi je fais ça
    Je vois pas trop comment reconstruire l'image après.
    Ce code n'est pas compilable et utilisable dans l'état actuel (du moins je ne pense pas).

    Concernant QTConcurrent, je vois pas comment l'utiliser, j'ai vu aussi QThreadPool.

    En fait c'est pour ça que j'ai fais ce post, si quelqu'un me donne un moyen efficace de faire ce que je veux faire, je suis preneur!

  7. #7
    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
    Les QtConcurrent sont des algorithmes au-dessus d'un pool de thread adapté à la machine.
    En gros il parcoure une liste d'objet et effectue une action à partir de celui là.


    Citation Envoyé par Kirozen Voir le message
    si quelqu'un me donne un moyen efficace de faire ce que je veux faire, je suis preneur!
    Alors qu'es ce que tu veux faire?

  8. #8
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Alors ce que je veux faire,

    Par exemple pour générer du bruit (comme je fais actuellement).

    Je veux pouvoir faire travailler plusieurs threads sur la même image (pixmap), afficher le résultat en temps réel et pouvoir gérer les threads dynamiquement (pouvoir les mettre en pause, les arrêter, en ajouter ou en supprimer).

    Chaque thread ayant un petit morceau de l'image à traiter, il faut que le gestionnaire puisse réutiliser une thread qui a terminé son travail pour lui assigner une nouvelle tâche.

    Est-ce plus clair ainsi?

  9. #9
    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 Kirozen Voir le message
    pouvoir les mettre en pause, les arrêter, en ajouter ou en supprimer
    pourquoi tu veux faire toute ces action?
    Pourquoi en ajouter et supprimer?

    Vue que c'est une utilisation trés trés fréquente, je ne pense pas que QtConcurrent soit adapté.

    Regarde QThreadPool qui devrais bien t'aider

  10. #10
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Il semblerait que mon code fonctionne mieux en évitant de passer l'image à chaque thread :-)

    Je vais mettre ce topic en résolu et peut-être prochainement en ouvrir un autre pour un autre soucis...

    Merci pour votre aide!

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

Discussions similaires

  1. interface graphique pour traitement d'image
    Par spinalrock dans le forum Interfaces Graphiques
    Réponses: 29
    Dernier message: 10/06/2008, 14h49
  2. librairie pour traitement d'image
    Par isoman dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 21/03/2008, 17h09
  3. Application distribué pour traitement d'images
    Par sylvain.cool dans le forum C++
    Réponses: 16
    Dernier message: 12/03/2008, 10h51
  4. [SPM2] Pour traitement d'images IRM
    Par larimoise dans le forum Images
    Réponses: 0
    Dernier message: 25/07/2007, 22h49
  5. API ou OCX gratuites pour traitement d'image
    Par uranium-design dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 02/09/2006, 16h03

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