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

C# Discussion :

fuite mémoire, quelles solutions ?


Sujet :

C#

  1. #21
    Membre éclairé
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par Axiome Voir le message
    Tu as tout à fait raison, mais n'oublies pas qu'ici je donne un exemple simple en utilisant le framework .net et que mon problème est plus complexe que ça par ce que j'utilise un framework propriétaire et je suis obligé de faire une instanciation de mon objet lors du clique sur le bouton.
    Si tu nous expliquait ton vrai problème au lieu de dire que tu est contraint par le FW. Tu sais, tout est pratiquement extensible. Tu peux faire ce que tu veux.

    Le framework est tres bien, je suis pret a gagé que c'est ton code, ou encore ta facon de faire qui est pas correct pour ton vrai problème.
    Remoting Context Matters
    Everything in this chapter is 100 percent undocumented. Reliance on these techniques is not supported by either Microsoft, the publisher, or the author of this book. Use at you own risk! If your computer won't work afterwards, your toaster blows up or your car doesn't start, I assume no liability whatsoever: You're now about to enter the uncharted territories of .NET and you do so on your own risk. I can only provide some guidance

  2. #22
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Axiome Voir le message
    Tu as tout à fait raison, mais n'oublies pas qu'ici je donne un exemple simple en utilisant le framework .net et que mon problème est plus complexe que ça par ce que j'utilise un framework propriétaire et je suis obligé de faire une instanciation de mon objet lors du clique sur le bouton.
    Tu pourrais donner des détails ?
    Parce qu'à mon avis, après avoir rajouté le picturebox en question dans le designer ou a la mano dans le constructeur de ta form, le code de ton button_click peut se résumer à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void button1_Click(object sender, EventArgs e)
            {
                if (pb.Image != null)
                 pb.Image.Dispose();
                pb.Image = new Bitmap("c:\\image.jpg");
            }
    Et là, pouf, pas de fuite mémoire, ni de fichier locké inutilement.
    ಠ_ಠ

  3. #23
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Et là, pouf, pas de fuite mémoire, ni de fichier locké inutilement.
    Et bien justement ! c'est en faisant ca que "c:\\image.jpg" sera locké inutilement, c'est pour ca que je passe par un stream !

    Pour le reste c ok
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #24
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Axiome Voir le message
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private void button1_Click(object sender, EventArgs e)
            {
                PictureBox pb = new PictureBox();
                pb.Image = new Bitmap("c:\\image.jpg");
                this.Controls.Add(pb);
            }
    on remarque bien qu'il y a une fuite mémoire...
    Comme c'est étonnant !
    A chaque click tu crées un nouveau PictureBox et tu l'ajoutes à la collection de contrôles de ta Form, créant ainsi des objets qui seront toujours reférencés et qui survivront donc à un Collect()...

    Donc, comme cela a déjà été dit, ce n'est pas une fuite, c'est un comportement normal par rapport à ton code.


    Citation Envoyé par shwin Voir le message
    Il y as pas de memoryleak en c# justement grace au GC
    C'est surtout là-dessus que je souhaitais réagir.

    Bon nombre d'applications .Net souffrent de fuites mémoire plus ou moins graves justement parce que les développeurs s'imaginent que le GC est un outil magique qui va prendre en charge le nettoyage.

    1. Le GC se base sur un graph de références afin de déterminer les objets libérables. Les erreurs de design, les références croisées et les abus d'objets ou de méthodes statiques peuvent très facilement le faire pédaler dans le semoule.

    2. La vision du GC reste confinée à son petit monde managé. Dès lors que le reflèxe du "using()" ou du "try/finally --> Dispose" n'est pas acquis pour toute utilisation d'objet implémentant IDisposable, le GC ne sera pas d'un grand secours...
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  5. #25
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Bon nombre d'applications .Net souffrent de fuites mémoire plus ou moins graves justement parce que les développeurs s'imaginent que le GC est un outil magique qui va prendre en charge le nettoyage.

    1. Le GC se base sur un graph de références afin de déterminer les objets libérables. Les erreurs de design, les références croisées et les abus d'objets ou de méthodes statiques peuvent très facilement le faire pédaler dans le semoule.

    2. La vision du GC reste confinée à son petit monde managé. Dès lors que le reflèxe du "using()" ou du "try/finally --> Dispose" n'est pas acquis pour toute utilisation d'objet implémentant IDisposable, le GC ne sera pas d'un grand secours...
    +1 000 000
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #26
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Sauf que là, en l'occurrence, c'est pas l'utilisation de using qui va sauver la mise, puisqu'on veut que l'objet vive plus longtemps que le bloc où il a été déclaré. Et dans ce cas là, il faut bien appeler Dispose à la main, plus tard.

    @olibara : je te crois sur parole, les applis que je code au taf n'ayant pas d'images à charger à la main
    ಠ_ಠ

  7. #27
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Guulh Voir le message
    il faut bien appeler Dispose à la main, plus tard
    devoir faire ça ne met-il pas en évidence un défaut de conception?
    "Winter is coming" (ma nouvelle page d'accueil)

  8. #28
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    devoir faire ça ne met-il pas en évidence un défaut de conception?
    Ben... non ?
    Indépendamment du concept de langage managé ou pas, de GC et tout le bazar : les objets ont une durée de vie, qui est certes le plus souvent celle du bloc où ils ont été déclarés (qu'ils soient des variables membres d'un objet, ou déclarés dans le corps d'une méthode), mais pas systématiquement.

    Sinon, il n'y aurait pas le mot-clé "delete" en C++.

    Dans le cas qui nous intéresse, justement : le picturebox a une propriété Image, dont le type est Disposable parce qu'une Image détient des ressources non managées. On veut changer cette image de temps en temps. On ne dispose l'image ni avec un bloc using, ni dans le Dispose de la form, mais à la main.
    ಠ_ಠ

  9. #29
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Non, pas dans le cas des Winforms et contrôles apparentés.

    Par extensions on pourrait dire que le problème ne peut pas vraiment se résumer à l'utilisation d'un "using()" pour tout objet dont le cycle de vie dépend d'une action de l'utilisateur...
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  10. #30
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Keihilin Voir le message
    Non, pas dans le cas des Winforms et contrôles apparentés.
    Parce que là en l'occurrence, indépendamment du problème de durée de vies des objets, en plus de ne pas disposer ses objets Image, Axiome utilisait un nouveau picturebox à chaque fois, ce qui est certes pas la meilleure chose à faire Mais le problème dont il est question n'est pas limité aux Winforms, qui font un usage standard de IDisposable : un gros machin (la form) instancie des tas de petits machins (les contrôles), dont il assure la responsabilité, puisqu'il les détruit quand lui-même est détruit.
    ಠ_ಠ

  11. #31
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Il est possible de faire une propriété pour accéder à la PictureBox comme cela est fait ci dessous pour un DataSet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private System.Data.DataSet _ds = null;
    protected System.Data.DataSet ds
    {
        get {
            if (_ds == null)
            {
                _ds = new System.Data.DataSet();
            }
            return _ds;
        }
    }
    Mais bon, en .net, tout est question de "class". S'agissant d'un bout de code non géré, la classe devrait être tout de même disposable. J'insiste lourdement?
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  12. #32
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Mais bon, en .net, tout est question de "class". S'agissant d'un bout de code non géré, la classe devrait être tout de même disposable. J'insiste lourdement?
    A+
    Beh c'est a dire que je vois pas ce que tu veux dire Quel rapport entre le lazy loading que tu présentes et la durée de vie des objets ? Tout est question de class ? Et personne ne doute que des classes comme PictureBox ou Bitmap doivent être Disposable

    En plus, la, dans ton exemple, tu crees un dataset sans le disposer, alors que c'est idisposable Donc y'a bien des cas où on crée un objet sans le détruire aussitôt.

    Et comme je disais tout a l'heure, le problème ici, c'est pas la picture box, puisqu'il suffit juste de changer sa propriete Image, sans toucher a la pb elle-même. La PictureBox, c'est un Control, et dans la plupart des applis, on définit ses controles dans le designer et on n'en rajoute ni n'en enlève plus au runtime.
    ಠ_ಠ

  13. #33
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Guulh Voir le message
    En plus, la, dans ton exemple, tu crees un dataset sans le disposer, alors que c'est idisposable
    Parce que j'ai pas codé la méthode dispose, vu que j'ai mis un exemple ici: http://www.developpez.net/forums/m4110724-8/. Ca me semblait
    Ce "lazy loading" serait plutôt un "loading on demand". Je sais pas si ce terme existe, mais il se conformerait au "instancier tard libérer tôt". Vu que c'est un membre privé, il suffit d'appeler la propriété pour créer l'objet ou récupérer l'instance en cours (tu l'as compris).

    Bon, je dis peut-être quelques betises vu que je fais jamais de WinForms.

    Je viens de remarquer un truc. Si j'ai un Form2.cs, j'ai aussi Form2.Designer.cs dans lequel je trouve:
    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
    36
    37
    38
    namespace WindowsApplication1
    {
        partial class Form2
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Windows Form Designer generated code
     
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Text = "Form2";
            }
     
            #endregion
        }
    }
    Un WinForm est disposable. Donc, il faudrait placer dans la méthode Dispose tout les objets disposables et les disposer.

    Non?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #34
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Un WinForm est disposable. Donc, il faudrait placer dans la méthode Dispose tout les objets disposables et les disposer.
    Ca tombe bien, c'est ce que fait le designer tout seul
    C'est ce que je disais tout a l'heure :
    les objets ont une durée de vie, qui est certes le plus souvent celle du bloc où ils ont été déclarés (qu'ils soient des variables membres d'un objet, ou déclarés dans le corps d'une méthode), mais pas systématiquement.
    Mais la, vu qu'on change l'image plusieurs fois pendant la vie de la fenetre (dans l'exemple d'Axiome, on change d'image a chaque click sur un bouton), on est amené à créer (et donc à disposer) plusieurs fois des objets disposable.
    ಠ_ಠ

  15. #35
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Mais la, vu qu'on change l'image plusieurs fois pendant la vie de la fenetre (dans l'exemple d'Axiome, on change d'image a chaque click sur un bouton),
    C'est plutôt toujours la même ou j'ai loupé un post?
    Citation Envoyé par Axiome Voir le message
    du coup l'image est rapidement disposé (juste après l'accolade de fermeture) et ne sera pas visible dans la forme après le clique sur le bouton.
    Je comprend pas trop ça. Comment se fait-il que l'image n'est pas visible?
    Citation Envoyé par Guulh Voir le message
    Ca tombe bien, c'est ce que fait le designer tout seul
    Ah? Parce que j'ai ajouté une PictureBox en mode design et VS n'a pas ajouté le dispose de cet objet dans le dispose du formulaire.
    A quoi vois-tu qu'il le fait?
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    namespace WindowsApplication1
    {
        partial class Form1
        {
            /// <summary>
            /// Required designer variable.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Clean up any resources being used.
            /// </summary>
            /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            #region Windows Form Designer generated code
     
            /// <summary>
            /// Required method for Designer support - do not modify
            /// the contents of this method with the code editor.
            /// </summary>
            private void InitializeComponent()
            {
                this.pictureBox1 = new System.Windows.Forms.PictureBox();
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
                this.SuspendLayout();
                // 
                // pictureBox1
                // 
                this.pictureBox1.Location = new System.Drawing.Point(13, 13);
                this.pictureBox1.Name = "pictureBox1";
                this.pictureBox1.Size = new System.Drawing.Size(100, 50);
                this.pictureBox1.TabIndex = 0;
                this.pictureBox1.TabStop = false;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size(292, 273);
                this.Controls.Add(this.pictureBox1);
                this.Name = "Form1";
                this.Text = "Form1";
                ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
                this.ResumeLayout(false);
     
            }
     
            #endregion
     
            private System.Windows.Forms.PictureBox pictureBox1;
        }
    }
    Serait-ce parce qu'il l'ajoute à la collection des controles?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Controls.Add(this.pictureBox1);
    Et que ensuiteDu coup, il faut peut-être suivre un pattern particulier pour ajouter des contrôles dynamiquement, non?
    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  16. #36
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    C'est plutôt toujours la même ou j'ai loupé un post?
    Ca doit être pour l'exemple qu'il a collé un nom de fichier en dur. Ou peut être que ce fichier est modifié par un autre process. Parce qu'en effet, ça servirait à rien de ercharger toujours la même image.
    Je comprend pas trop ça. Comment se fait-il que l'image n'est pas visible?
    Beh si tu disposes un objet, il est plus utilisable.


    Serait-ce parce qu'il l'ajoute à la collection des controles?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Controls.Add(this.pictureBox1);
    Et que ensuiteDu coup, il faut peut-être suivre un pattern particulier pour ajouter des contrôles dynamiquement, non?
    A+
    Tout juste Il suffit de faire comme le designer, en cas de création dynamique de contrôle : l'ajouter à la collection après sa création. Si on en a plus besoin avant la mort de la Form, il faut juste le Disposer après l'avoir enlevé de la collection Controls.
    ಠ_ಠ

  17. #37
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Beh si tu disposes un objet, il est plus utilisable.
    Non? Ce que je me demandais c'est pourquoi l'image ne serait-elle pas visible alors qu'elle a été ajouté à la PictureBox et la PictureBox ajoutée aux controles? Il faut vraiment que la durée de vie de la PB soit la même que celle du form?
    "Winter is coming" (ma nouvelle page d'accueil)

  18. #38
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par Immobilis Voir le message
    Non? Ce que je me demandais c'est pourquoi l'image ne serait-elle pas visible alors qu'elle a été ajouté à la PictureBox et la PictureBox ajoutée aux controles?
    Beh parce que ses ressources (graphiques, GDI+ en l'occurence) ont été libérées. Et que si on a disposé un objet, c'est qu'on considère qu'on en a plus besoin. et une image qu'on affiche dans une fenêtre, on en a besoin.

    La doc : http://msdn.microsoft.com/en-us/library/8th8381z.aspx
    Citation Envoyé par MSDN
    Call Dispose when you are finished using the Image. The Dispose method leaves the Image in an unusable state. After calling Dispose, you must release all references to the Image so the garbage collector can reclaim the memory that the Image was occupying.
    ಠ_ಠ

  19. #39
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Bon il semblerait que la meilleur solution soit:
    1. Form1.cs
      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
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Text;
      using System.Windows.Forms;
      using System.IO;
       
      namespace WindowsApplication1
      {
          public partial class Form1 : Form
          {
              private PictureBox pb = null;
       
              public Form1()
              {
                  InitializeComponent();
              }
       
              private void button1_Click(object sender, EventArgs e)
              {
                  using (FileStream fs = new FileStream(@"c:\temp\test.jpg", FileMode.Open, FileAccess.Read))
                  {
                      pb.Image = Image.FromStream(fs, true, true);
                  }
              }
          }
      }
    2. Form1.Designer.cs
      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
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      namespace WindowsApplication1
      {
          partial class Form1
          {
              /// <summary>
              /// Required designer variable.
              /// </summary>
              private System.ComponentModel.IContainer components = null;
       
              /// <summary>
              /// Clean up any resources being used.
              /// </summary>
              /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
              protected override void Dispose(bool disposing)
              {
                  if (disposing && (components != null))
                  {
                      components.Dispose();
                  }
                  base.Dispose(disposing);
              }
       
              #region Windows Form Designer generated code
       
              /// <summary>
              /// Required method for Designer support - do not modify
              /// the contents of this method with the code editor.
              /// </summary>
              private void InitializeComponent()
              {
                  this.button1 = new System.Windows.Forms.Button();
                  this.pb = new System.Windows.Forms.PictureBox();
       
                  this.SuspendLayout();
                  // 
                  // button1
                  // 
                  this.button1.Location = new System.Drawing.Point(181, 217);
                  this.button1.Name = "button1";
                  this.button1.Size = new System.Drawing.Size(75, 23);
                  this.button1.TabIndex = 0;
                  this.button1.Text = "button1";
                  this.button1.UseVisualStyleBackColor = true;
                  this.button1.Click += new System.EventHandler(this.button1_Click);
                  // 
                  // Form1
                  // 
                  this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                  this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                  this.ClientSize = new System.Drawing.Size(292, 266);
                  this.Controls.Add(this.button1);
                  this.Controls.Add(this.pb);
                  this.Name = "Form1";
                  this.Text = "Form1";
                  this.ResumeLayout(false);
       
              }
       
              #endregion
       
              private System.Windows.Forms.Button button1;
          }
      }
    Les compteurs de perf affichent les valeurs de "handles GC" les moins élevées (cf image jointe)
    Ce compteur affiche le nombre actuel de handles GC utilisés. Les Handles GC sont des handles pour les ressources externes au CLR et à l'environnement managé. Les handles occupent de petites quantités de mémoire dans le tas GC, mais nécessitent des ressources non managées qui peuvent être coûteuses.
    Images attachées Images attachées  
    "Winter is coming" (ma nouvelle page d'accueil)

  20. #40
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Sauf qu'il y a pas besoin de déclarer la picturebox dans le form.cs, autant le laisser dans le form.designer.cs.

    Et ta solution crée une nouvelle instance de Image, qu'il faudrait bien disposer à la main si jamais on change d'image par la suite.
    ಠ_ಠ

Discussions similaires

  1. [tomcat][memoire] java.net.URL et fuite mémoire
    Par Seiya dans le forum Tomcat et TomEE
    Réponses: 6
    Dernier message: 09/03/2009, 10h41
  2. Outil de recherche de fuite mémoire
    Par eag35 dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 12h46
  3. [SWT]SWT et fuite mémoire(ou pas)
    Par menuge dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 22/06/2004, 21h40
  4. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17
  5. [debug] fuites mémoires
    Par tmonjalo dans le forum C
    Réponses: 3
    Dernier message: 28/07/2003, 17h20

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