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

Delphi Discussion :

Destruction en instance d'un objet


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut Destruction en instance d'un objet
    Je ne sais pas précisément comment fonctionne les mécanisme de destruction d'un objet, c'est ce qui me pose problème.

    J'ai un objet (visuel) créé dynamiquement, dont le propriétaire est un panel (dont son propriétaire est une TForm).

    D'une part, je gère moi même sa destruction lorsqu'il le faut.
    D'autre part, cet objet peut très bien être libéré également, si son propriétaire est lui même détruit. (exemple, je ferme l'appli).

    je maintiens mes objets dans une liste (TObjectList), Liste qui est détruite systématiquement dans le finalize de l'unité.

    Si je gère moi meme les destructions, pas de probleme.
    Mais lorsque la destruction du propriétaire de mes objets est invoquée, je pense qu'il y a une 1ere phase de marquage des objets à libérer, avant la phase effective de libération.

    Entre ces 2 phases, mon TObjectList est détruit -> et tente donc de détruire également mes objets.

    Le problème, c'est que la fonction de destruction de mon TObjectList ne "sait" pas que ces objets sont en instance de destruction par les propriétaires (Objet pas à nil, ca s'est normal, mais surtout, tout est encore valide dans l'obtention de ses propriétés et méthodes, donc pas moyen de savoir s'il est en cours de destruction ou non).

    Meme si je créé mes objets avec un propriétaire à Nil, L'application semble tenter de les libérer et se retrouvent dans le même état que précédemment.

    J'ai bien trouvé une astuce, j'ai constaté que les controls visuels comme des panels à l'interieur de mes objets, étaient eux, libérés (panel=nil) par exemple.
    -> j'imagine que les destructions "remontent".
    Cette solution ne me plait pas car trop empirique et je suis pas sur de mon coup.

    Donc, la question: Existe-il un moyen pour savoir si un objet est en cours de destruction. ie, à un moment donné, savoir si l'ordre de destruction de cet objet à été donné, bien que l'objet existe encore afin de ne pas donner un 2eme ordre de destruction sur cet objet (et une violation d'accès seulement un peu plus tard).

    Merci

  2. #2
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Je pense que l'objet est détruit par son propriétaire et ensuite ta liste est détruite. Mais la référence de l'objet est toujours dans la liste qui essaye de détruire un objet déjà détruit.

    Si ta liste est détruite dans le finalization, c'est qu'elle est en dehors d'une classe, mais elle contient des objets créés par une instance de fenêtre ? C'est un peu bizarre comme architecture, tu veux faire quoi exactement ?

    Bloon

  3. #3
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Bon, merci Bloon pour ta réponse, et je concois que ma demande est un peu obscure mais elle est bien justifiée.
    Le probleme, est qu'une destruction n'est jamais immédiate, mais boucle sur les composants détenu par le propriétaire.

    J'ai trouvé ce qu'il me fallait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not ( csDestroying in MonCompo.ComponentState )
      then MonCompo.Free;
    Cela me permet de libérérer mes objets, quelque soit leur état. même si le proprio a entre temps envie de détruire l'objets.

    Bloon, cela concerne en gros, des Frames, détenus par des compos. qui sont gérés manuellement dans la création et la destruction. (en gros).

    Merci de ton attention en tout cas!

    EDIT:
    Je pense que l'objet est détruit par son propriétaire et ensuite ta liste est détruite. Mais la référence de l'objet est toujours dans la liste qui essaye de détruire un objet déjà détruit.
    Dans le meilleur de monde, ce serait ca effectivement cela, et je pourrais m'apercevoir que mon objet n'existe plus (meme si pas à nil), en testant dans un try/except l'accès à une propriété.
    --> mais la destruction de ma liste est entre 2 eaux, le problèmes était là:
    entre la demande de destruction (par le proprio) et la destruction effective.

  4. #4
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Je pensais que le finalization était exécuté vraiment à la fin, donc après la destruction des fenêtres et autres, mais je n'ai jamais été confronté à ce problème, donc c'était juste une supposition... qui semble fausse :-)

    Bloon

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

Discussions similaires

  1. Destruction de l'instance d'un objet WINDOW
    Par mbzhackers dans le forum Forms
    Réponses: 2
    Dernier message: 17/02/2009, 15h02
  2. Sauver l'instance d'un objet dans un TMemoryStream
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 11/09/2005, 09h23
  3. [Classe] Auto destruction d'instances
    Par Clorish dans le forum Langage
    Réponses: 7
    Dernier message: 11/07/2005, 14h52
  4. Réponses: 5
    Dernier message: 25/05/2005, 22h29
  5. Conditions de destruction des instances de classes
    Par elvivo dans le forum Général Python
    Réponses: 4
    Dernier message: 29/12/2004, 17h16

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