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 :

[MFC] Prise de tête avec UpdateAllViews


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut [MFC] Prise de tête avec UpdateAllViews
    Salut à tous !

    j'ai un petit soucis que je n'arrive point à comprendre mais que je pense être assez banal.

    Voici le contexte :

    je travaille avec le modèle Vue/Document dans lequel j'ai plusieurs vues pour un seul documents.

    Dans la classe correspondant à mon Document, j'ai des appels à la fonction de raffraichisement "UpdateAllViews(NULL)" à plusieurs endroit, et ça fonctionne bien...mais là, j'ai voulu l'ajouter encore une fois dans mon code du Document et quand j'y passe BAM : "Violation d'accès lors de la lecture de l'emplacement blablabla"

    Si ça plantait tout le temps, je dirais ok, mais le problème c'est que cela ne plante que pour cet appel là...et ça, je ne le comprend pas.

    Quelqu'un connait-il ce problème ?

    Merci d'avance pour vos réponses !

    ++

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu fais cet appel à un moment où le document est encore viable ? si tu traces, le document correspond-il encore a quelque chose ou bien a-t-il été détruit (ou bien par encore créé)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Mon document n'est pas détruit. Tout est nickel de ce côté là vu que ça fonctionne avec les autre UpdateAllViews...

    C'est un genre de cas bizarre...

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    oui, mais il est fait à quel moment ce updateAllViews qui ne marche pas ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Il est fait à la fin d'une fonction qui ajoute un élément dans une liste, change l'état d'un booléen et ajoute des éléments divers dans des vecteurs...bref, rien qui détruise mon document.

    Surtout que lorsqu'il n'y a pas ce UpdateAllViews, tout va bien, sauf que j'actualise pas mes vues à la fin de cette fonction là...

  6. #6
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    bah quand ca plante, le debugger t'indique ou et pourquoi (généralement un pointeur à l'ouest)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Voici le message d'erreur que j'obtiens tout d'abord :

    "Exception non gérée à 0x7c22700a (mfc71d.dll) dans VTrack.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xfeeefeee."

    Le débuggeur est alors arrêté sur la fonction "IsKindOf" du fichier "objcore.cpp" = classe "CObject" du RunTimeClass

    Il est arrêté sur cette ligne ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CRuntimeClass* pClassThis = GetRuntimeClass();"

    Si je remonte dans la pile, je peux vous en dire encore plus :

    L'appel à isKindOf à été lancé par la fonction GetNextView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ASSERT_KINDOF(CView, pView);"
    L'appel au GetNextView à été lancé par la fameuse fonction UpdateAllviews :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    POSITION pos = GetFirstViewPosition();
    	while (pos != NULL)
    	{
    		CView* pView = GetNextView(pos);
    		ASSERT_VALID(pView);
    		if (pView != pSender)
    			pView->OnUpdate(pSender, lHint, pHint);
    	}

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Apparemment, il ne gueule que si je fais l'updateAllViews sur la classe correspondant à la vue "principale" de mon document :

    UpdateAllViews(NULL) quand je suis dans le document
    ou bien
    UpdateAllViews(CVtrackView)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Je pourrait me passer de ce UpdateAllViews si seulement j'arrivait à mettre à jour une seule vue...mais j'y arrive pas.

  10. #10
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    ton crash signifie que tu as une vue à l'ouest pour une raison que j'ignore.

    si tu ne veux pas passer par UpdateAllViews, sauvegarde le pointeur de chaque vu dans un tableau à la création et suprime le à la destruction comme ca tu as une liste de vue à toi

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    J'arrive à récupérer un pointeur sur ma vue de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    POSITION pos = GetFirstViewPosition();
    while (pos != NULL)
    {
        CView* pView = GetNextView(pos);
        ASSERT(pView);
        if (pView->IsKindOf( RUNTIME_CLASS(CTableauDeBordDialog) ))
        {
              pView->UpdateWindow();
              break;
        }
    }
    Mais le Updatewindow ne fait rien....
    Ca passe bien dedans, mais rien ne se reffraichi...mais ça plante pas non plus ! lol

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Bon, je viens de trouver un truc qui fonctionne :
    une fois que j'ai mon pointeur sur la vue de la fenêtre que je veux actualiser, je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pView->GetParent()->Invalidate();
    ça actualise bien ma fenêtre...
    Cette méthode peut-elle me poser un problème par la suite ?

  13. #13
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    ca demande à la fenetre parent de se rafraichir donc de rafraichir ses fenetres filles.

    les consequences : je ne sais pas, ca depend de ton appli

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    D'après les tests que j'ai pu faire....ça ne cause aucun souci avec mon appli.

    Et en cherchant un peu plus loin, j'ai trouvé pourquoi l'UpdateAllViews plantait complètement :
    il faisait appel à une fonction dans laquelle j'actualise une CListCtrl en utilisant sa fonction SetItemState(nItem, LVIS_SELECTED, LVIS_SELECTED) => cf FAQ VisualC++ ("comment selectionner un élément dans une liste ?")

    Or, il se trouve que SetItemState envoi un message au système et qu'ensuite un UpdateAllViews est appelé...

    Du coup, vous voyez bien venir le truc : BOUCLE INFINIE !

    Le message d'erreur que j'avais venait simplement de l'épuisement de la mémoire dû à cette boucle infinie...

    Merci pour votre aide.

    ++

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

Discussions similaires

  1. Prise de tête avec une douchette
    Par serendib dans le forum WinDev
    Réponses: 6
    Dernier message: 05/09/2014, 12h09
  2. Prise de tête avec les ""
    Par jeff1494 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 09/11/2009, 22h03
  3. Éviter une prise de tête avec les Includes
    Par Lisp_ dans le forum C++
    Réponses: 7
    Dernier message: 29/06/2009, 17h41
  4. Réponses: 4
    Dernier message: 23/10/2006, 09h09
  5. [MFC]: prise en compte du clavier
    Par ben_iap dans le forum MFC
    Réponses: 8
    Dernier message: 20/01/2004, 15h00

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