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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    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 : 51
    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
    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 averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    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 averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    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 : 51
    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
    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 averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 36
    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é.

+ 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