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

DirectX Discussion :

Libérer les ressources lors de la fermeture d'un programme


Sujet :

DirectX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut Libérer les ressources lors de la fermeture d'un programme
    Bonjour ! Je suis confronté à un problème lors de la fermeture par ALT+F4 de mon programme DirectX.

    En effet, par ALT+F4, au début je lançais la destruction des objets, mais ... Erreur Fatale : la boucle de rendu fonctionne tout le temps, et les objets ne peuvent etre détruits qu'à un certaint moment.

    J'ai donc mis juste une commande d'arret de la boucle et placé les destructions après la boucle de rendu.

    Mais là, ALT+F4 bugge encore : la destruction n'a apparemment pas lieu (la musique continue d'être jouée, par exemple), comme si ALT+F4 provoquait l'arrêt IMMEDIAT de l'application au sortir de la fonction WndProc() et non l'attente que l'application rende la main par elle-même.

    Quelle est la solution ? Merci d'avance

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 125
    Points : 117
    Points
    117
    Par défaut ...........
    Et si tu faisais des Release des ressources lorsqu'on tape sur Alt+F4...ca pourrait faire ton bonheur
    Projets de développement en assembleur x86: http://membres.lycos.fr/cvslike/ ou http://thesheep.free.fr/decasm/

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Merci ! Mais les releases ne peuvent pas etre faites à ce moment, car alors un bug se déclenche, car la fonction d'update est apparemment simultanée : elle continue, or comment, par exemple, afficher grâce à un device qui a été libéré ?

    A moins que ce soit impossible qu'une fonction quelconque continue après l'appui de ALT+F4 et que l'erreur vienne donc d'ailleurs...

    J'attends vos suggestions !

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il faudrait que tu suive l'evolution de ton programme apres avoir appuyé sur Alt-F4 (en debug pas à pas ou en loggant regulierement du texte) et voir ce qui se produit, moi personnellement je n'ai jamais eu de problème en faisant comme ça.

  5. #5
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Heliopraetor
    A moins que ce soit impossible qu'une fonction quelconque continue après l'appui de ALT+F4 et que l'erreur vienne donc d'ailleurs...!
    Alt+f4 ne fait qu'envoyer un message à ton application. message que tu es sensé traiter toi-meme. Il n'y a rien de "magique" en programmation.
    Si tu provoques la sortie de ton programme dès que tu reçois le message de fermeture (WM_CLOSE), alors tu dois aussi libérer tes ressources à ce moment là.

    En général on traite les messages windows en dehors de la boucle principale de rendu. Voir les nombreux exemples du SDK pour une bonne pratique de programmation windows.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos conseils, je vais effectivement suivre le pas à pas en mode debug.

    L'ennui, c'est qu'en mode debug le bug en question semble ne pas se produire (la musique s'arrête, par exemple)...

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Autre information : j'ai placé une messagebox juste après la boucle de message, et elle est exécutée normalement en mode debug, mais pas en mode release !

  8. #8
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Heliopraetor
    Autre information : j'ai placé une messagebox juste après la boucle de message, et elle est exécutée normalement en mode debug, mais pas en mode release !
    c'est bien tu as un bug dans ton programme..

    On aimerait en dire plus mais avec plus d'informations..
    (un code source, c'est pas mal).

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Voilà des extraits de la fonction WinMain :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    bool g_CallBoucle=true;
     
    WinMain(...)
    {
    	//... (initialisations)
     
    	while(g_CallBoucle)
    	{
    //pour les erreurs non debug
    			if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
    			{
    				if ( !GetMessage(&Msg, NULL, 0, 0) ) g_CallBoucle=false;
    					DispatchMessage(&Msg);
    			}
    			else
    			{
    				if( !Update() ) g_CallBoucle=false;
    			}
    	}
    	g_CLogM->AddEvent("Boucle de jeu interrompue");
     
    	//-----Suppressions finales
    	FreeAll();
    	DestroyWindow(g_hDlg);
    	PostQuitMessage(0);
    	UnregisterClass("wc",g_Instance);
        return Msg.wParam;					//on quitte proprement
    }
    ...et de la fonction de procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    		case WM_DESTROY:
    		case WM_CLOSE:
    		case WM_QUIT:
    			g_CallBoucle=false;
    			break;
    		default:
    			return DefWindowProc(hwnd, message, wParam, lParam);
    	}
    	return 0;
    }
    Enfin, dernière précision, FreeAll() est la fonction qui libère toutes les ressources, y compris le son et la musique.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Juin 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    A défault de solution, j'ai pu contourner le problème en ajoutant la condition IsWindow() à chaque passage dans la boucle : si l'on a appuyé sur ALT+F4, la fenêtre se détruit DE TOUTE FACON, et ainsi, indirectement, le pb est résolu.

    Merci encore !

  11. #11
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    voila une boucle d'un vieux projet:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        MSG  msg;
        PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );
        bReady = true;
        while( WM_QUIT != msg.message  ) 
        {
            // Use PeekMessage() if the app is active, so we can use idle time to
            // render the scene. Else, use GetMessage() to avoid eating CPU time.
            MSG msg;
            if (bActive ) {
            if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
            {
                if( FALSE == GetMessage( &msg, NULL, 0, 0 ) )
                    return msg.wParam;
     
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else 
            {
                // Render a frame during idle time (no messages are waiting)
                if( bActive && bReady ) 
                {
                        //if (bFocus)
                        GAME_SystemNext();
                }
            }
            } else {
                if( FALSE == GetMessage( &msg, NULL, 0, 0 ) ) 
                    return msg.wParam;
     
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
        return msg.wParam;
    Je quitte lorsque le message = WM_QUIT simplement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            case WM_CLOSE: 
                GAME_SystemCleanup();
                PostQuitMessage(0);
                return 0;
    C'est moi meme qui poste le message "WM_QUIT" lorsque je détecte qu'on ferme la fenetre. Game_systemCleanup inclut la destruction de toutes les ressources (d3d, dsound, dinput) ainsi que la destruction de la fenetre principale.

    Il y a pas mal de rafinements possibles mais ça ca doit suffire pour quitter correctement ton projet.

    Quant à la Window Procedure, il faudrait la rendre un peu plus complete
    pour se charger des redimensionnements, des focus, etc..
    Essaie de regarder le source de d3dapp.cpp dans le dx sdk. Il est très complet.

    A+
    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

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

Discussions similaires

  1. (LWJGL) Libérer les ressources à la fermeture ?
    Par Faelucc dans le forum OpenGL
    Réponses: 3
    Dernier message: 28/06/2011, 17h52
  2. Libérer les ressources
    Par mouloudéen dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/03/2009, 09h46
  3. [SWT] Libérer les ressources
    Par soft0613 dans le forum SWT/JFace
    Réponses: 15
    Dernier message: 04/08/2008, 13h32
  4. Réponses: 3
    Dernier message: 09/10/2006, 19h22
  5. Réponses: 2
    Dernier message: 18/03/2005, 13h00

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