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

Threads & Processus C++ Discussion :

thread ou pas


Sujet :

Threads & Processus C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut thread ou pas
    bonjour,

    je suis en train de programmer sous visual C++.

    Le but de mon projet est d'afficher le profil d'une image live d'une caméra et de le traiter (filtre). Pour l'affichage, tout va bien.

    Maintenant je suis dans la phase de traitement. Je me pose donc la question d'intégrer des threads dans mon code afin d'effectuer le traitement de l'image en parallèle de sa visualisation.

    Est ce une bonne solution ? Est ce que le thread est capable de suivre la cadence de rafraichissement de l'image de ma caméra ? Cette notion de thread est nouvelle pour moi et un peu abstraite.

    merci d'avance

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La notion de thread n'est présente - si on la simplifie à l'extrême - que pour permettre le travail en parallèle (de faire deux ou plusieurs choses en même temps).

    Tu est donc bien dans un cadre d'utilisation de threads lorsque tu écris
    Maintenant je suis dans la phase de traitement. Je me pose donc la question d'intégrer des threads dans mon code afin d'effectuer le traitement de l'image en parallèle de sa visualisation.


    Quant à savoir si le traitement sera en mesure de suivre la cadence de rafraichissement de la caméra... la réponse de normand s'impose: peut être... ou pas

    Il y a énormément de paramètres qui interviennent, allant du nombre minimum d'images à afficher en une période P à la taille des images, en passant par sa complexité, le nombre de couleur et la complexité du traitement que tu veux appliquer...

    Tu auras surement beaucoup plus de chances d'obtenir une vitesse d'affichage de l'ordre de 10 images par second avec une image de 10px par 10 codée sur 256 couleurs avec un traitement léger que d'obtenir une vitesse d'affichage de l'ordre de 200 images secondes avec une image de 1000 par 1000 px codées en couleurs réelles avec un traitement lourd
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci pour cette réponse.

    je me lance donc dans les thread. je code sous visual C++ en dialog base. est-il difficile d'intégrer des thread dans mon code déjà bien avancé ou faut-il que je réorganise tout ....

    merci

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ah, voilà encore des questions pour auxquelles il sera difficile de répondre de manière générale

    Déjà, il faut que ta manière d'utiliser les images soient "thread safe" (qu'il n'y ai pas un thread qui modifie une image pendant que tu essaye, justement, de l'afficher, ou que deux threads différents essayent, au même moment, de modifier la même image, par exemple).

    Ensuite, il faut voir la bibliothèque de gestion de thread que tu utilise, certaines étant plus facile à manipuler et ou à introduire que d'autres...

    Il est généralement utile d'envisager l'utilisation de threads séparés dés le départ, mais il n'est pas impossible, selon la complexité du projet, de partir de quelque chose d'existant pour y ajouter la gestion "cohérente" des threads...

    Jusqu'à présent, nous parlons de manière bien trop générale pour pouvoir te donner les explications qui s'appliquent à ton cas et à ton code particulier.

    Une chose est sure: tu devra sans doute effectuer une révision en profondeur de ton code, de manière à rendre l'ensemble "thread safe"... Quant à savoir si ce sera fastidieux ou complexe à réaliser, cela dépendra grandement de l'existant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci pour ces conseils.

    je sens que ca ne va pas être aisé .....

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par marie6631 Voir le message
    merci pour ces conseils.

    je sens que ca ne va pas être aisé .....
    Aisé, peut être pas, mais surement pas impossible

    Bon courage
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    N'oublies pas de consulter les entrées de la FAQ MFC sur les threads (j'ai cru comprendre que tu travaillais avec les MFC).

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    oui merci.

    j'ai compris le fonctionnement des threads en mode console. mais j'ai du mal à passer en mode boite de dialogue.

    pouvez vous me donner des pistes ...

    merci

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Globalement, je dirais que tu passes par CreateThread/AfxBeginThread pour créer ton thread de travail et tu privilégies les échanges entre le thread de travail/boîte de dialogue par des messages (WM_USER_XXX). Sections critiques et mutex sont alors tes amis pour les données partagées.
    Tu peux trouver des infos sur le MSDN.

  10. #10
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    Citation Envoyé par marie6631 Voir le message
    Le but de mon projet est d'afficher le profil d'une image live d'une caméra et de le traiter (filtre). Pour l'affichage, tout va bien.

    Maintenant je suis dans la phase de traitement. Je me pose donc la question d'intégrer des threads dans mon code afin d'effectuer le traitement de l'image en parallèle de sa visualisation.
    Je ne vois pas trop ce que le multi-thread vient faire là-dedans. La description de ce que tu souhaites faire semble strictement séquentiel, non ?

    1) Récupérer une frame (c'est à dire un pointeur vers un bloc de mémoire)
    2) Traitement (modifier le bloc de mémoire par l'intermédiaire du pointeur)
    3) Affichage (passer le pointeur et la taille à la fonction d'affichage)

    Avec deux threads que pourrait-on faire de plus ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Thread Image                     Thread Traitement
    --------------------------------------------------
    Récupérer frame                      Attendre
                      Synchronisation
    Attendre                             Traitement
                      Synchronisation 
    Affichage                            Attendre

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    L'utilisation de la gestion de threads aurait surtout pour but de permettre de travailler sous la forme de
    • afficher image1 pendant qu'on recupère image2 et qu'on traite image3
    • afficher image3 pendant qu'on récupère image1 et qu'on traite image2
    • afficher image2 pendant qu'on récupère image3 et qu'on traite image1
    • recommencer
    (exemple parmi d'autre )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    merci pour ces détails

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Je ne vois pas trop ce que le multi-thread vient faire là-dedans. La description de ce que tu souhaites faire semble strictement séquentiel, non ?
    Citation Envoyé par koala01 Voir le message
    L'utilisation de la gestion de threads aurait surtout pour but de permettre de travailler sous la forme de
    • afficher image1 pendant qu'on recupère image2 et qu'on traite image3
    • afficher image3 pendant qu'on récupère image1 et qu'on traite image2
    • afficher image2 pendant qu'on récupère image3 et qu'on traite image1
    • recommencer
    (exemple parmi d'autre )
    Salut,
    Personnellement, j'y voit un intérêt souvent remonté par les utilisateurs : ne pas figer l'IHM pendant le traitement. Même si l'IHM ne permet de rien faire en attendant le résultat, elle peut afficher une animation d'attente ou de progression indiquant à l'utilisateur que tout va bien...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    bonjour,

    j'ai tenté de coder deux boutons pour leur faire afficher un MessageBox. Mais dès le premier bouton ca ne compile pas. Voici mon code :

    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
     
    //dans le .h
    UINT ThreadFunc(LPVOID Param);
     
    //dans le .cpp
    UINT ThreadFunc(LPVOID Param)
    {
    	CThreadtestDlg *pObject = (CThreadtestDlg*)Param;
     
    	AfxMessageBox("premier thread");
    	return 0;
     
    }
     
    void CThreadtestDlg::OnMb() 
    {
    	// TODO: Add your control notification handler code here
    	CThreadtestDlg *pNewObject = new CThreadtestDlg;
    	AfxBeginThread(ThreadFunc,pNewObject);	
    }
    l'erreur est : AfxBeginThread : none of the 2 overloads can convert parameter 1 from type unsigned int (void*)

    en modifiant mon code en mettant this à la place de pNewObject et un &ThreadFunc, ça ne fonctionne toujours pas.

    merci

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    La cb doit être de forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UINT __cdecl MyControllingFunction( LPVOID pParam );
    Donc, j'aurais tendance à dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UINT __cdecl ThreadFunc(LPVOID Param);
     
    //dans le .cpp
    UINT __cdecl ThreadFunc(LPVOID Param)
    {
    	AfxMessageBox("premier thread");
    	return 0; 
    }
    Néanmoins, j'ai quelque doute sur la façon dont tu démarres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CThreadtestDlg *pNewObject = new CThreadtestDlg;
    Ca, ça m'inquiète

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    c'est bon ça marche j'ai repris le tuto de farscape. oufff!!

    donc j'ai deux boutons qui lancent des threads qui sont en fait des messages box.

    Mon soucis est que tant que je ne ferme pas la première message box je ne peux pas accéder à ma fenêtre principale. Ce n'est pas bon. Car je voudrais ouvrir les deux en parallèles. C'est l'avantage des threads non ?

    merci

  17. #17
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    A ce point de vue là, ton interface graphique permet surement de déterminer si la fenêtre ouverte doit être de type "modale" ou non, et l'utilisation de MessageBox n'est peut etre pas la meilleure solution, je partirais plutôt vers une fenêtre fille, non modale, quitte, effectivement, à ce qu'elle lance un thread pour le traitement en lui-même
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 70
    Par défaut
    je ne vous embête plus. j'ai codé un exemple avec une progress bar en fond. c'est beaucoup plus parlant. tout fonctionne.

    merci pour votre aide

  19. #19
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Attention, si tes différents threads doivent avoir une IHM, pars sur des objets dérivant de CWinThread. Sans vouloir te décourager, plusieurs threads IHM, c'est souvent plus de soucis qu'autre chose. En général, on a un thread IHM et les autres sont des worker thread (ils ne disposent pas d'IHM).

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

Discussions similaires

  1. Threading ou pas threading?si oui, comment?
    Par nanettemontp dans le forum Windows
    Réponses: 59
    Dernier message: 10/10/2007, 10h55
  2. Thread ou pas Thread ?
    Par Franck.H dans le forum SDL
    Réponses: 8
    Dernier message: 04/12/2006, 21h10
  3. Boost::asio : multi threading ou pas?
    Par Alp dans le forum Boost
    Réponses: 9
    Dernier message: 02/09/2006, 22h01
  4. [blem C++ thread ou pas threads]
    Par fastzombi dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 28/10/2005, 23h09
  5. [THREAD][DAEMON]Pas bien compris....
    Par XristofGreek dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 24/09/2004, 13h28

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