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 Forms Discussion :

[C# 2.0] Problème gestion mémoire


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut [C# 2.0] Problème gestion mémoire
    Bonjour,
    voilà j'ai créé un programme en C# avec Visual Studio 2005 qui contient un menu composé d'images .png.
    Lorsque je pose mon curseur de souris sur une image, celle-ci change, car j'ai mis une action sur l'événement mouse_hover.

    private void pictureBox2_MouseHover(object sender, EventArgs e)
    {
    pictureBox2.BackgroundImage = System.Drawing.Bitmap.FromFile(@"demarrage_hover.png");
    }


    Et l'image redevient celle par défaut lorsque le curseur quitte la zone:

    private void pictureBox2_MouseLeave(object sender, EventArgs e)
    {
    pictureBox2.BackgroundImage = System.Drawing.Bitmap.FromFile(@"demarrage.png");
    }


    Le problème c'est quand je regarde les ressources mémoire avec Ctrl+Alt+Suppr. Dès qu'un événément survient (un mouse_hover ou un mouse_leave), la consommation mémoire ne cesse d'augmenter. Je passe de 25 Mo au démarrage à plus de 40 Mo après quelques clics sur les images.
    Et cette consommation mémoire ne diminue jamais.
    J'aurais voulu savoir comment faire pour libérer les ressources mémoire, afin de bien les gérer, pour que la consommation reste aux environs de 25 Mo.
    Merci de votre aide.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 122
    Points : 124
    Points
    124
    Par défaut
    Salut,

    Il me semble que c'est le fonctionnement même de la CLR.
    Lorsque tu lance un programme .NET, il prend plus de mémoire que nécessaire (à condition que l'OS te la fournisse). Cela évite de faire des réallocations toutes les 3 secondes.

  3. #3
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    joujou_le_fou a raison, c'est le fonctionnement même de la gestion mémoire de .NET qui est en cause. Il privilégie la rapidité à la consommation mémoire, et alloue donc une certaine mémoire en fonction des objets qui risquent d'être utilisés.

    J'avais un pb similaire sur un service Windows que j'avais développé en .NET, et je trouvais que la mémoire prise par mon application était énorme par rapport à un programme développé en C++/Win32. Tu peux baisser cette consommation en utilisation la fonction SetProcessWorkingSetSize de temps en temps (toutes les 15 minutes pour mon cas):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    [DllImport("kernel32.dll")]
    static extern bool SetProcessWorkingSetSize( IntPtr hProcess, int dwMinimumWorkingSetSize, int dwMaximumWorkingSetSize );
     
    try
    {
    SetProcessWorkingSetSize( Process.GetCurrentProcess().Handle, -1, -1 );
    }
    catch{}
    Mais attention à la baisse de performances si ton programme demande beaucoup de resources. C'est vraiment une méthode de dernier recours.

    Sinon, essaie voir d'allouer deux objets images à l'initialisation de ton application et de les assigner à ta PictureBox2 lors de tes deux évènements souris. Le fait qu'il doive charger un fichier à chaque passage de souris est me semble-t-il pénalisant du point de vu des performances. Par contre, je ne sais pas si il va y avoir une différence niveau conso mémoire.



    PS: N'oublie pas le tag RESOLU sur ton post si tu as eu toutes les réponses voulues.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses, je vais essayer d'allouer les deux objets images à l'initialisation de l'application et de les assigner à ta PictureBox2 lors des deux évènements souris. Pourriez-vous me dire quel est le code source pour faire cela ?

  5. #5
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    C'est assez simple...

    Tu déclares deux variables image1 et image2 par exemple comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     public Image image1;
     public Image image2;
    Dans ton Form_Load():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     image1 = Bitmap.FromFile(@"demarrage_hover.png"); ou Image.FromFile(@"demarrage_hover.png");
    idem pour image2.

    Après, avec tes évènements de souris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void pictureBox2_MouseHover(object sender, EventArgs e)
    {
    pictureBox2.BackgroundImage = image1;
    }
     
    private void pictureBox2_MouseLeave(object sender, EventArgs e)
    {
    pictureBox2.BackgroundImage = image2;
    }
    Maintenant, est-ce que ça change quelque chose dans la conso mémoire, je n'ai pas testé...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Je viens de faire le test et il n'y a aucun changement dans l'utilisation des ressources mémoire.
    Je vais donc laisser mon programme tel quel, car à part ce problème de consommation mémoire, les performances sont excellentes.

  7. #7
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    Pas de soucis!

    Tant que ça marche.


  8. #8
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    Je pense qu'un petit code du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (pictureBox1.Image != null)
        pictureBox1.Image.Dispose();
    pictureBox1.Image = monImage;
    Pour aider à libérer la mémoire.
    Ca amrche avec Image, ca devrait être la même chose pour BackgroundImage

  9. #9
    Xno
    Xno est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 71
    Points : 83
    Points
    83
    Par défaut
    Oups!

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Fregolo52, j'ai essayé ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (pictureBox1.Image != null)
        pictureBox1.Image.Dispose();
    pictureBox1.Image = monImage;
    J'ai remplacé Image par BackgroundImage et j'ai un message d'erreur lorsque je passe la souris sur l'image plus d'une fois:
    L'exception System.ArgumentException n'a pas été gérée
    Message="Le paramètre n'est pas valide."
    Source="System.Drawing"

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 122
    Points : 124
    Points
    124
    Par défaut
    Tu devrais peut etre mettre pictureBox1.Image à null après le dispose

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Juin 2006
    Messages : 73
    Points : 58
    Points
    58
    Par défaut
    tu peux aussi tout simplement faire 2 pictures box avec l'image normal dans l'une, et l'image roll over dans l'autre. Sachant qu'elles sont l'une sur l'autre et que une seul des 2 est visible à la fois.

    Quand ta souris passe sur Image1, ça cache Image1 et affiche Image2.
    Quand ta souris sors de Image2, ça cache Image2 et réaffiche Image1 (via les propriété visible des PictureBox).

    De cette manière, tu ne réalloues jamais de mémoire. Tu te contente de cacher et montrer des composants PictureBox.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    J'ai essayé la méthode de Xtream, mais j'ai toujours le même comportement concernant la mémoire; elle ne cesse d'augmenter quand je fais un mouse leave/hover.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Ca y est, problème résolu. J'avais oublié de mettre en commentaires une partie de code, que j'avais mis dans mouse hover, qui permettait en plus de lire un son grâce à "Microsoft.DirectX.AudioVideoPlayback.Audio".
    C'était donc une nouvelle instance de AudioVideoPlayback, qui se recréé à chaque passage de souris.
    Merci à tous pour vos conseils.

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

Discussions similaires

  1. Problème ntdll, Gestion mémoire..
    Par krapo13 dans le forum C++
    Réponses: 37
    Dernier message: 31/05/2011, 17h59
  2. Problèmes gestion mémoire?
    Par jehro37 dans le forum Windows
    Réponses: 1
    Dernier message: 26/09/2008, 09h38
  3. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  4. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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