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

MFC Discussion :

Affichage de la progression d'un thread


Sujet :

MFC

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut Affichage de la progression d'un thread
    Bonjour,

    Un petit cas d'école tout bête, mais je n'arrive pas à faire ce que je veux...

    J'ai une DLL dont le point d'entrée est une fonction statique qui instancie une classe de traitement.
    Cette classe de traitement construit une CDialog et lance un thread (_beginThreadex) qui fait un travail long.
    La CDialog doit afficher l'état d'avancement du thread et permettre de le stopper.
    Pour communiquer avec la CDialog, le thread poste régulièrement des messages d'avancement et un message de fin. Jusque-là tout va bien...

    Mon souci est qu'à la fin de l'exécution du thread, j'ai besoin de retourner dans ma classe de traitement.
    Le seul moyen que j'ai trouvé est de passer par la CDialog en utilisant le message de fin posté par le thread.
    Les autres solutions (WaitForSingleObject ou section critique) ne fonctionnent pas car elles bloquent le thread principal et la CDialog ne réagit plus.

    Pour arriver à mes fins, je dois donc faire un lien de la CDialog vers la classe de traitement... ce que je voudrais éviter !

    Quelqu'un a-t-il une solution ?

    PS : j'ai essayé de faire communiquer mon thread de travail avec la CWinApp (plutôt qu'avec la CDialog) en utilisant PostThreadMessage vers des messages traités au niveau de l'appli mais pas moyen de le faire marcher : les messages sont bien postés mais n'arrivent pas dans la CWinApp (même en redéfinissant PreTranslateMessage et sans toucher à la fenêtre !).

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Bonjour,
    Déjà, en MFC, on n'utilise pas _beginthreadex() : Il faut utiliser AfxBeginThread().

    Ensuite, le mieux, pour communiquer entre thread et boîte de dialogue, c'est de créer la boîte de dialogue juste avant le thread, et de passer son handle au thread. Ensuite, un simple PostMessage() ou SendMessage() suffit pour informer la boîte de dialogue de la progression et de la fin du thread...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Merci Médinoc.
    J'ai remplacé le _beginthreadex par AfxBeginThread. C'est plus propre comme ça.
    Le comportement reste cependant le même.
    En fait, je n'ai pas de problème pour faire communiquer le thread avec la CDialog (ok avec PostMessage).
    J'ai plutôt un problème de communication entre le thread de travail et le thread principal pour récupérer la main quand le thread de travail a fini: je ne peux pas utiliser les modes habituels de communications entre threads (WaitForSingleObject ou EnterCriticalSection...) car ils bloquent le thread principal, or si je veux que la CDialog réagisse, il faut que le thread principal retourne dans la boucle d'événement générale.
    Une fois dans cet état, il me semble que tout nouveau traitement dans le thread principal ne peut être déclenché qu'en passant par la CDialog (soit par action utilisateur ou soit par un message posté par le thread). Ce qui oblige à faire un lien de la CDialog vers la classe de traitement.

    Comme je débute en MFC, je voulais savoir si des développeurs plus expérimentés auraient fait pareil ou s'il y a d'autres solutions possibles (délocaliser la CDialog dans le thread de travail?).

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Et pourquoi pas faire fermer la CDialog, si elle sert juste à montrer la progression du thread?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    J'utilise le OnClose de la CDialog pour l'annulation par l'usager.
    J'utilise un message spécifique posté par le thread quand il a fini pour fermer automatiquement la CDialog et poursuivre mes traitements.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    C'est bien ce que je conseillais.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Ok. Finalement, j'ai donc gardé la solution où la CDialog a un pointeur vers la classe de traitement. Ca marche plutôt bien et de toute façon, c'est la seule solution que j'ai trouvée.
    L'architecture générale mise en place est donc la suivante :
    - la classe de traitement crée la CDialog et déclenche le thread de travail
    - le thread principal retourne dans la boucle d'événement générale
    - le thread poste des messages à la CDialog pour l'affichage de la progression
    - sur annulation de la CDialog, on retourne dans la classe de traitement qui signale un event d'arrêt au thread et attend qu'il se termine pour continuer son travail.
    Je passe le sujet à RESOLU.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    pense a regarder la faq ,le procedé y etait decrit ....

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2011, 08h58
  2. Affichage texte dans un text buffer (Thread)
    Par mrttlemonde dans le forum GUI
    Réponses: 1
    Dernier message: 26/01/2010, 21h12
  3. affichage barre de progression
    Par marie6631 dans le forum MFC
    Réponses: 14
    Dernier message: 18/03/2009, 17h37
  4. Background Worker / Problème affichage image de progression
    Par Saten dans le forum Windows Forms
    Réponses: 12
    Dernier message: 02/12/2008, 13h32
  5. Progression d'un thread ?
    Par Shypster dans le forum C#
    Réponses: 10
    Dernier message: 30/01/2008, 09h20

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