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

VB.NET Discussion :

[VB.NET][VS2005] Impression: comment s'assurer que mon destructeur est appelé?


Sujet :

VB.NET

  1. #1
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut [VB.NET][VS2005] Impression: comment s'assurer que mon destructeur est appelé?
    Bonjour,

    J'espère que la question est assez claire dans le titre (sinon, je vous prie de m'en excuser). Je me suis fait une classe Affiche85x11 qui hérite de la classe PrintDocument, afin d'ajouter à mon application un modèle d'affiche à imprimer (tous les objets graphiques, dont une image JPEG, sont minutieusement placés et j'obtiens par Win32 les marges physiques de l'imprimante pour calculer le bon point d'origine de tout mon modèle d'affiche..

    Le code pour lancer l'impression de l'affiche:

    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
     
            Dim prnDialog85x11 As New PrintDialog
            Dim affiche As New Affiche85x11
            prnDialog85x11.Document = affiche
            prnDialog85x11.AllowSomePages = True
            Try
                If prnDialog85x11.ShowDialog() = Windows.Forms.DialogResult.OK Then
                    affiche.Print()
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            Finally
                ' Peu importe ce qui arrive, il faut «caller» le destructeur
                If Not affiche Is Nothing Then
                    affiche.Dispose()
                End If
            End Try
    Je ne suis pas sûre d'avoir placé le bon code à la bonne place, car je ne vois aucun changement dans l'utilisation de la mémoire par mon application. Possible que je ne comprenne pas clairement comment fonctionne la classe PrintDocument (dont dérive la mienne), est-ce que la fonction Dispose et/ou Finalize est appelée sitôt l'impression terminée (rendant mon Finally inutile)? Ou encore faut-il que je force un Dispose/Finalize, et autrement que ce que j'ai écrit ci-haut?

    Merci de bien vouloir éclairer ma lanterne.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par annedeblois
    Je ne suis pas sûre d'avoir placé le bon code à la bonne place,
    Ça semble ok.
    Si c'est en 2.0, utiliser Using serait plus simple, mais le principe est le même.

    Citation Envoyé par annedeblois
    car je ne vois aucun changement dans l'utilisation de la mémoire par mon application.
    Ça c'est un des grands mystères récurrents de .NET. La mémoire est libérée quand le garbage collector a envie de la libérer.

    Dispose sert essentiellement à indiquer que l'objet n'est plus utilisé, donc que la mémoire qu'il utilise *peut* être libérée. S'il contient des ressources non-gérées par le framework, il est censé les détruire (auquel cas la mémoire correspondante est bien libérée). Pour les ressources gérées par le framework, ça passe sous la coupe du garbage collector, et là il ne vaut mieux pas attendre de le voir faire quelque chose :)

    S'il reste encore des centaines de Mo de mémoire disponibles, il ne va pas être très pressé de se mettre au travail :)

    Citation Envoyé par annedeblois
    Ou encore faut-il que je force un Dispose/Finalize, et autrement que ce que j'ai écrit ci-haut?
    Finalize ne se force pas et on n'en a de toute façon pas besoin. Dispose est déjà appelé correctement dans le code indiqué. Pas besoin de faire grand chose de plus, sauf peut-être vérifier que les références aux objets ne trainent pas inutilement pendant des lustres, puisque le GC ne s'attaque qu'aux objets que plus personne ne référence.

    Par exemple si une classe a comme membre une DataTable qui contient des tonnes de données, que cette table n'est utilisée que pendant un petit moment mais que l'objet qui la contient 'existe' pendant toute la durée de l'application, la mémoire utilisée par la DataTable ne sera pas libérée.
    Une façon de l'éviter est de mettre la variable à Nothing. Une meilleure façon est de la sortir (avec le code qui l'utilise) dans une autre classe dont la durée de vie est plus courte :)

  3. #3
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    @Maniak:

  4. #4
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Tu peux toujours appeler le garbage collector explicitement via gc.collect()

    http://msdn2.microsoft.com/en-us/library/xe0c2357.aspx

  5. #5
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 118
    Points : 70
    Points
    70
    Par défaut
    Salut !

    Si tu utilises .NET 1.0 / 1.1, tu es OK quoique je ne suis pas certain que la clause Finally soit nécéssaire.

    Si tu utilises .NET 2.0, alors utilise le Using Statement qui existe maintenant en VB.NET.

    Pour plus d'infos: http://pluralsight.com/blogs/fritz/a...4/28/7834.aspx

    Martin

  6. #6
    Membre expert
    Avatar de annedeblois
    Femme Profil pro
    Analyste d'exploitation
    Inscrit en
    Août 2005
    Messages
    1 485
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 49
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste d'exploitation
    Secteur : Service public

    Informations forums :
    Inscription : Août 2005
    Messages : 1 485
    Points : 3 218
    Points
    3 218
    Par défaut
    Citation Envoyé par stephane eyskens
    Tu peux toujours appeler le garbage collector explicitement via gc.collect()

    http://msdn2.microsoft.com/en-us/library/xe0c2357.aspx
    Merci! Mais je n'osais tellement pas le faire à la lumière de toutes les discussions à ce sujet...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par stephane eyskens
    Tu peux toujours appeler le garbage collector explicitement via gc.collect()
    Ce qui ne fait que lui demander si ça le tente de faire une collection là tout de suite, sans aucune garantie qu'il le fera. Je l'ai rarement vu obéir d'ailleurs :)

  8. #8
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par annedeblois
    Merci! Mais je n'osais tellement pas le faire à la lumière de toutes les discussions à ce sujet...
    Bah tu ne risques pas grand chose, au pire, il ne libère pas la mémoire.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 652
    Points : 730
    Points
    730
    Par défaut
    Citation Envoyé par stephane eyskens
    Bah tu ne risques pas grand chose, au pire, il ne libère pas la mémoire.
    Mais s'il prend le temps de la libérer alors que ce n'était pas nécessaire, c'est du temps perdu pour rien. Si c'est fait trop fréquemment et sans justification, c'est pas génial pour les perfs.

  10. #10
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par Maniak
    Mais s'il prend le temps de la libérer alors que ce n'était pas nécessaire, c'est du temps perdu pour rien. Si c'est fait trop fréquemment et sans justification, c'est pas génial pour les perfs.
    Oui mais faut savoir ce qu'on veut . La question originale consiste à savoir comment libérer de la mémoire immédiatement.

    Faut pas tout transformer, j'ai jamais dit qu'il fallait appeler le GC toutes les 3 secondes non plus.

    Je vais même te dire mieux, si un composant consomme beaucoup de mémoire et si l'on souhaite vraiment libérer celle-ci de manière certaine, à tous les coups et sans la moindre faille, à ce moment là, faut travailler en unmanaged.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/05/2013, 17h22
  2. Comment m'assurer que deux variable sont des int
    Par pierrot10 dans le forum Langage
    Réponses: 3
    Dernier message: 03/02/2012, 10h07
  3. Réponses: 5
    Dernier message: 28/11/2010, 19h01
  4. Comment m'assurer que mon fichier est bien un exec unix
    Par Khaled.Noordin dans le forum Apple
    Réponses: 5
    Dernier message: 05/07/2007, 18h37
  5. Comment s'assurer que "window.open" ouvre une nouvelle fenêtre
    Par lodan dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 14/03/2007, 11h12

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