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 :

Suppression réelle d'éléments stockés dans une liste.


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 19
    Points
    19
    Par défaut Suppression réelle d'éléments stockés dans une liste.
    Bonjour,

    Je me pose une petite question après avoir fait un test:

    J'ai une liste contenant des objets. Dans le destructeur de ces objets je fais un Console.WriteLine(). Et je me rend compte que lorsque je supprime un élément de la liste ou que je remplace un élément de la liste par un objet de même type, je n'ai aucune sortie sur la console. En revanche, une fois le programme fermé, la console affiche tout les writeline.

    En fait, je pensais que le garbage collector supprimait tout les objets lorsqu'ils n'étaient plus contenus dans la liste. Du coup, quel est le meilleur moyen d'obtenir ce résultat ? Une suppression brute de l'objet avant la suppression de l'élément de la liste ?

    Merci beaucoup pour votre aide.

    Julien.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    Le Garbage Collector à un fonctionnement un peu particulier. Lorsqu'un objet est supprimé, en général il sera encore présent dans le Garbage.

    Si tu attends suffisamment longtemps, le Garbage supprimera l'objet. En effet à intervalle à peu près régulier, il vérifie si des objets ne sont plus référencés et donc il les supprime.

    Tu peux accélérer le vidage du Garbage :

    http://msdn.microsoft.com/fr-fr/library/xe0c2357#Y459

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Bonjour et merci pour ta réponse,

    Donc tu me confirme que le fonctionnement est bien celui-ci : Suppression d'un élément d'une liste = suppression de l'objet par le garbage collector après un certain temps. Parce que cet espace de temps me semble très long, après 2 minutes toujours rien...

    C'est pour une application graphique et j'aimerai que l'objet se supprime tout de suite pour qu'à partir du destructeur je puisse lancer une animation de destruction et un son par exemple. Mais si je suis sûr que le garbage collector passe après moi même quelques minutes après la suppression de l'élément de la liste, alors je peux très bien lancer ce genre de traitement avec des méthodes supplémentaires respectives.

    Merci encore.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Effectivement, le GC.Collect() fonctionne bien. Mais ce n'est pas un peu barbare si j'en fais un toute les seconde environ ?

    Edit : Après réflexion, j'en fais un toute les frames.

  5. #5
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Re.

    En effet, le fonctionnement du Garbage est un poil plus complexe. Il communique avec l'OS pour la gestion mémoire. Si l'OS a besoin de mémoire, il va demander au Garbage s'il ne peut pas restituer un peu de celle-ci. A ce moment-là, le Garbage va collecter.

    Mais s'il n'y a pas de problème avec la mémoire et que ton programme n'est pas gourmand, le Garbage ne va pas collecter, évitant des cycles processeurs inutiles.

    Le Garbage alloue une taille mémoire fixe à ton programme à son lancement. Tant que tu ne dépasses pas cette allocation, j'imagine que le Garbage reste tranquille.

    Je n'ai jamais senti le besoin d'utiliser "Collect". Je pense que c'est inutile de s'en inquiéter si le programme se comporte normalement. Je pense que c'est vraiment pour des cas particuliers ou pour du débugage.

    Je te conseillerai donc de laisser le Garbage gérer la mémoire.

    Citation Envoyé par gollunk Voir le message
    C'est pour une application graphique et j'aimerai que l'objet se supprime tout de suite pour qu'à partir du destructeur je puisse lancer une animation de destruction et un son par exemple.
    Merci encore.
    Un destructeur sert en général à libérer les ressources de l'objet. Dans ce cas il faut implémenter IDispose.

    Mais dans ton cas, le destructeur va créer de nouvelles ressources (pas bon). Tu dois déclencher l'animation et le son juste avant de supprimer l'objet de la liste. Ainsi tu auras la meilleure réactivité possible.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Je ne pouvais pas avoir réponse plus précise et plus clair, merci infiniment .

    Pour ce qui est de IDispose, j'avais cru comprendre que c'était pour les ressources non managées, donc si j'ai bien saisi les ressources qui ne sont pas gérées par le GC. Je me trompe ?

    Edit : Et j'ai une dernière question, y a t-il un moyen de savoir si un objet n'a aucune référence ( et est donc éligible à la libération par le GC ). Ainsi, je pourrai automatiser les traitements que je veux mettre en place ( son, animation ) en fonction d'un booléen dans le processus de l'objet plutôt que de demander le traitement à tout les endroits où l'objet est susceptible d'être supprimé.

  7. #7
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Citation Envoyé par gollunk Voir le message
    Pour ce qui est de IDispose, j'avais cru comprendre que c'était pour les ressources non managées, donc si j'ai bien saisi les ressources qui ne sont pas gérées par le GC. Je me trompe ?
    Si ton objet ouvre un fichier en écriture, une fonction dispose va permettre de relâcher le handle du fichier immédiatement. Auquel cas le fichier ne sera pas accessible avant la fermeture du programme ou le Collect de l'objet.


    Citation Envoyé par gollunk Voir le message
    Edit : Et j'ai une dernière question, y a t-il un moyen de savoir si un objet n'a aucune référence ( et est donc éligible à la libération par le GC ). Ainsi, je pourrai automatiser les traitements que je veux mettre en place ( son, animation ) en fonction d'un booléen dans le processus de l'objet plutôt que de demander le traitement à tout les endroits où l'objet est susceptible d'être supprimé.
    Regarde sur le net et dans la documentation du framework. Je ne suis pas certain, mais il me semble qu'il est possible d'accéder à des informations sur le Garbage Collector.

    Sinon une méthode, c'est d'utiliser un compteur de référence threadsafe de l'objet. Quand l'obet est référencé le compteur augmente et quand l'objet est déréférencé, le compteur diminue. Lorsque le compteur vaut zéro, l'objet peut-être détruit.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    1) Supprimer l'objet de la liste ne le fait pas disparaitre. Ca ne fait qu'effacer la réference de l'objet dans la liste
    2) Appeller le Garbage collecteur aurait pour effet de le forcer a vider les objets qui ne sont plus référencé.
    a) Logiquement tu n'as pas a te préoccuper du Garbage collector
    b) Avoir supprimer l'objet de ta liste ne veut pas dire qu'il n'y a plus de référence à ton objets
    3) Donc oui il faut implémenter IDIspoable
    utiliser des usings et faire le Close toi meme quand tu "fermer" l'objets
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    Points : 19
    Points
    19
    Par défaut
    Merci encore Moldavi.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 20/09/2019, 22h36
  2. Afficher les elements stockés dans une liste
    Par Triste dans le forum Débuter
    Réponses: 3
    Dernier message: 15/10/2007, 15h28
  3. Réponses: 7
    Dernier message: 27/05/2007, 16h46
  4. [Débutant] copier l'élément sélectionner dans une liste
    Par Henry9 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/04/2007, 21h49

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