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 :

Bug aléatoire lors de la fermeture d'une fenêtre modale avec EndModalLoop()


Sujet :

MFC

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Bug aléatoire lors de la fermeture d'une fenêtre modale avec EndModalLoop()
    Bonjour,

    Je suis novice en développement C++, et aussi nouvelle utilisatrice de ce forum... Je suis confrontée aux threads depuis peu et je ne parviens pas à gérer un problème lors de la terminaison d'un thread.
    Voici mon problème : j'utilise une fenêtre modale qui sert de fenêtre d'attente lors d'un calcul important dans mon application. Pour cela, je crée un thread qui exécute la fonction DoModal(). A la fin de mon calcul, j'appelle la fonction EndModalLoop() et je reviens à mon application principale.
    Tout se passe bien dans la plupart des cas mais il se peut qu'un bug se produise au niveau du EndModalLoop(). Il ne se produit qu'en Release et je ne parviens pas à le reproduire.
    Auriez-vous connaissance d'un problème de ce genre avec l'utilisation de EndModalLoop() ?

    Merci d'avance !

  2. #2
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu devrais regarder ce post de la faq:
    http://c.developpez.com/faq/vc/?page...keWorkerThread
    un thread de travail ne doit pas initier une dialogue ...
    http://c.developpez.com/faq/vc/?page...d#WorkerThread

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse. Par contre, je ne comprends pas bien la partie du FAQ "Comment travailler sur des objets MFC à partir d'un thread de service ?" et je n'arrive pas à établir de rapport avec mon implémentation

    Dans ma classe CMyDialog, j'ai écrit une fonction StartDlg() qui crée un thread grace à AfxBeginThread (ce que j'ai fait ressemble beauoup au paragraphe du FAQ : Utilisation de AfxBeginThread() pour créer un worker thread).
    Et c'est dans la fonction de controle de mon thread (ThreadFunc) que j'appelle le DoModal(). C'est ça qu'il faut éviter ?

    Aurais-tu un exemple à me donner ?

    Merci beaucoup par avance car là je suis vraiment dans l'impasse...

  4. #4
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par Milie38
    Merci pour ta réponse. Par contre, je ne comprends pas bien la partie du FAQ "Comment travailler sur des objets MFC à partir d'un thread de service ?" et je n'arrive pas à établir de rapport avec mon implémentation

    Dans ma classe CMyDialog, j'ai écrit une fonction StartDlg() qui crée un thread grace à AfxBeginThread (ce que j'ai fait ressemble beauoup au paragraphe du FAQ : Utilisation de AfxBeginThread() pour créer un worker thread).
    Et c'est dans la fonction de controle de mon thread (ThreadFunc) que j'appelle le DoModal(). C'est ça qu'il faut éviter ?

    Aurais-tu un exemple à me donner ?

    Merci beaucoup par avance car là je suis vraiment dans l'impasse...
    oui c'est a proscrire ...
    pourquoi as tu besoin de créer une dialogue à partir du thread ?
    si tu dois absolument faire l'appel à une dialogue ,alors il faut envoyer un message à partir du thread à l'interface fenêtre et lancer la dialogue dans ce message .
    c'est la qu'intervient le topic de la faq:
    Comment travailler sur des objets MFC à partir d'un thread de service ?
    et donc la mise en place d'un message privé:
    http://c.developpez.com/faq/vc/?page...PrivateMessage

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par farscape
    oui c'est a proscrire ...
    pourquoi as tu besoin de créer une dialogue à partir du thread ?
    si tu dois absolument faire l'appel à une dialogue ,alors il faut envoyer un message à partir du thread à l'interface fenêtre et lancer la dialogue dans ce message .
    c'est la qu'intervient le topic de la faq:
    Comment travailler sur des objets MFC à partir d'un thread de service ?
    et donc la mise en place d'un message privé:
    http://c.developpez.com/faq/vc/?page...PrivateMessage
    En fait, je souhaite juste avoir une fenêtre modale 'd'attente' qui fasse patienter l'utilisateur à chaque calcul important de l'aplication. Dans certains cas, j'affiche une barre de progression c'est pourquoi je voulais créer ma dialogue dans un thread. Mais peut-être que ce n'est pas du tout la bonne méthode... Existe-il quelque chose de plus adapté ?

  6. #6
    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
    Points : 17 323
    Points
    17 323
    Par défaut
    ok,
    alors tu fais une boîte de dialogue non modale :
    http://c.developpez.com/faq/vc/?page...gPostNcDestroy
    celle-ci est créée dans l'interface et pas dans le thread.
    le thread doit y avoir accés (cette dialogue peut être une donnée membre pointeur de l'interface principal).
    tu créés un message privé dans cette dialogue (cf mon precedent post)
    dans ce message tu mets à jour ton progress control.

    à patir du thread tu envois le message privé à la dialogue popup pour la mettre à jour.

Discussions similaires

  1. [GTK+] Signal lors de la fermeture d'une fenêtre secondaire
    Par Skarsnick dans le forum GTK+ avec C & C++
    Réponses: 7
    Dernier message: 15/02/2010, 08h53
  2. Réponses: 2
    Dernier message: 29/03/2007, 11h26
  3. Réponses: 3
    Dernier message: 24/01/2006, 11h27
  4. Evènement sur le body lors de la fermeture d'une fenêtre
    Par Yaz dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 17h54
  5. Arrêter un ttmt en cours, lors de la fermeture d'une fenêtre
    Par teska dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/12/2004, 14h08

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