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

Windows Discussion :

Mauvais pointeur? Violation acces


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut Mauvais pointeur? Violation acces
    Bonjour,

    J'ai réussi à créer un programme qui a pour but de créer une fenetre windows dans laquelle je crée 16 fenetres filles.

    Puis, je tente de faire un rendu très basique (afficher tout bleu) de directX dans chacune de ses fenetres filles.

    J'ai créer une structure qui contient des informations sur chaque fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct MyChildWnd
    {
    	int index; 
    	HWND hWnd;
    	LPDIRECT3D9 d3d;
    	LPDIRECT3DDEVICE9 d3ddev;
    };
    Ensuite, je stocke chacune des structures dans une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<MyChildWnd*> listChild;
    Dans la boucle infinie, je tente de faire le rendu et lorsque je ferme la fenetre, j'ai un problème d'accés (violation). Qu'en pensez vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	
    list<MyChildWnd*>::iterator it;
    for (it = listChild.begin(); it != listChild.end(); it++) 
    {
    	render_frame((*it)->d3ddev);
    }
    Et voici ma fonction render_frame () :
    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
    void render_frame(LPDIRECT3DDEVICE9 d3ddev)
    {
        // clear the window to a deep blue
        d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);
    
        d3ddev->BeginScene();    // begins the 3D scene
    
        // do 3D rendering on the back buffer here
    
        d3ddev->EndScene();    // ends the 3D scene
    
        d3ddev->Present(NULL, NULL, NULL, NULL);    // displays the created frame
    
        return;
    }
    à savoir, mes fenetres s'affichent bien... quand je passe au débugger , il y a un problème lorsque je ferme ma fenetre...

    Le but de ce programme est de déterminer combien de rendu, il est possible de réaliser avec DirectX... Mais je ne comprends pas pourquoi il y a un accés violation...?

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    à savoir, mes fenetres s'affichent bien... quand je passe au débugger , il y a un problème lorsque je ferme ma fenetre...
    Parce que le WM_DESTROY est mal géré.
    Sur WM_ACTIVATE ou WM_CREATE il faudrait initialiser un booléen et s'il est à true effectuer le rendu.
    Dans quel message Windows est effectué le rendu ?
    Dans la boucle infinie, je tente de faire le rendu et lorsque je ferme la fenetre, j'ai un problème d'accés (violation). Qu'en pensez vous?
    Pas étonnant que cela plante car tu continues à boucler alors que la fenêtre fille est détruite et que son HWND n'est plus valide !

    Citation Envoyé par zuzuu Voir le message
    Le but de ce programme est de déterminer combien de rendu, il est possible de réaliser avec DirectX... Mais je ne comprends pas pourquoi il y a un accés violation...?
    C'est une mauvaise méthode que de faire cela de manière empirique ; il ne faut pas procéder par tatonnements comme cela parce que ta machine elle a une VRAM de 128M par exemple mais sur une machine de 64 megs cela ne fonctionnera plus.
    Il faut que tu appelles des API soit Windows SDK de base soit Direct X qui te renseignent sur la config matérielle

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Tu veux dire que pendant que les autres fenetres se détruisent, il tente de faire un rendu avec des fenetres qui n'existe déjà plus ?

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par zuzuu Voir le message
    Tu veux dire que pendant que les autres fenetres se détruisent, il tente de faire un rendu avec des fenetres qui n'existe déjà plus ?
    oui tu as tout pigé
    Mais tu n'as pas répondu à ma question : dans quel partie du code s'effectue le rendu ? Après GetMessage/TranslateMessage/DispatchMessage dans la procédurde de fenêtre ?
    C'est en général là ou on le place

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Apres le tout :
    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
    	
    while(TRUE)
    {
    	if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    	{
    		if (msg.message == WM_QUIT)
    			break;
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    		
    	list<MyChildWnd*>::iterator it;
    	for (it = listChild.begin(); it != listChild.end(); it++) 
    	{
    		render_frame((*it)->d3ddev);
    	}		
    }

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Ben justement, le problème est que ce n'est pas possible de le détéminer dans l'API. D'un ordinateur à l'autre, cela peut changer du tout au tout...

  7. #7
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    Citation Envoyé par zuzuu Voir le message
    Ben justement, le problème est que ce n'est pas possible de le détéminer dans l'API. D'un ordinateur à l'autre, cela peut changer du tout au tout...
    si si fouiller dans le MSDN et le SDK de Direct X et notamment Direct 3D il ya des fonctionnalités pour cela.
    Par exemple avec VC++ et Direct X version supérieur à 8 il y a une sorte de wizard qui te permet de faire un exemple et qui a recours à des tas d'initialisations.
    Tout est dans le SDK

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Points : 109
    Points
    109
    Par défaut
    Je fouine, je fouine, je t'assure... Pour l'instant, j'ai pas vraiment trouvé à part peu etre du coté de IAMVideoAccelerator. Peu etre en connaissant l'espace restant...

    En tout cas, j'ai fait des tests depuis hier et le nombre d'espace de rendu possible dépends fortement de la taille des fentres où le rendu s'effectue.
    Par exemple, je n'ai pu ouvrir que 9 vidéos simultanées ayant la taille de mon écran. Par contre, je suis allée bien au dela si elles étaient crées de manière plus petite dès le début...
    Je comprends pas trop ce qui se passe pour gérer un rendu?

Discussions similaires

  1. Violation Accès concurentiel
    Par Cybercorp dans le forum Windows Forms
    Réponses: 8
    Dernier message: 26/09/2007, 20h00
  2. Violation accès concurrentiel
    Par jcervelle dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/04/2007, 09h27
  3. Violation accès mémoire
    Par BenjaminLustrement dans le forum C
    Réponses: 9
    Dernier message: 09/06/2006, 10h07
  4. Pointeur et accès structure
    Par nunurs83 dans le forum C
    Réponses: 10
    Dernier message: 14/05/2006, 20h16
  5. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 08h47

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