none
Empécher le Garbage collector de détruire un formulaire RRS feed

  • Discussion générale

  • Bonjour,

    Voici mon problème :

    J'ai intégré pour la première fois dans mon application un formulaire (en anglais "form") provenant d'une autre application. Tout s'est passé très bien, y compris le renommage du formulaire qui, autrement, portait le même nom qu'un formulaire déjà présent dans l'application.

    Malheureusement, en remettant en service une à une les différentes procédures j'ai eu la surprise de constater que dans l'une d'entre elle qui se terminait par l'ouverture d'un formulaire, ce dernier ne s'ouvrait pas.

    Procédant à d'autres vérifications, j'ai reçu, en tentant d'ouvrir ce formulaire par la mis en place d'un bouton (formulaire.show()) un message disant qu'il était impossible d'ouvrir un objet supprimé. J'ai constaté effectivement que le formulaire avait bel et bien disparu de la mémoire vive (il réapparaît si on sort et qu'on relance l'application).

    J'en déduit que quelque chose qui pourrait bien être le Garbage Collector a effacé malencontreusement ce formulaire. Le fait que ce formulaire soit un "alien" pourrait bien en être la cause.

    J'ai essayé de dir au GC de ne pas toucher au formulaire (GC.KeepAlive(formulaire))  mais ça n'a pas marché (en fait, je ne sait pas où positionner cette commande, la doc de Microsoft est très ambiguë là-dessus, disant qu'il faut la placer après quelque-chose de mal définie).

    Qui , pourrait m'apporter une aide bien désirée ? (je ne suis pas, de loin, un champion dans la programmation).

    D'avance merci.


    Pierre Allemand

    mercredi 2 septembre 2020 17:14

Toutes les réponses

  • Bonjour,

    Il sera utile de partager le code concernant cette procédure qui pose le problème pour clarifier la question.
    Dans le cas général, un tel comportement peut être causé, par exemple, par des objets créés dynamiquement dans la procédure et pour une certaine raison, aucun objet n'est créé pendant leur exécution. Si c'est le cas, essayez de rendre statiques ces objets. Revoyez la logique d'exécution de cette procédure. 

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 3 septembre 2020 13:56
    Modérateur
  • Merci de vous intéresser à mon cas. Comment puis-je vous transmettre le code ?

    Pierre Allemand

    jeudi 3 septembre 2020 21:04
  • Bonjour,

    Vous pouvez poster la partie du code qui pose le problème dans une nouvelle réponse - il y a une option "Insert Code Block":

    ou dans OneDrive par exemple et de donner un lien.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    vendredi 4 septembre 2020 07:30
    Modérateur
  • Bonjour,

    Voici le code qui conduit à l'effacement du formulaire "TableDesDonnées"

        Private Sub Enregistrement_Click(sender As Object, e As EventArgs) Handles Enregistrement.Click
            Organisation = Référence.Text
            If Organisation = "" Then
                Organisation = InputBox("Entrer la référence à laquelle se rattache le mot de passe", "", "")
            End If
            MàJ2 = True
            Enregistrement.Visible = False
            Résultat.Visible = False
            Référence.Visible = False
            Label4.Visible = False
            Label6.Visible = False
            'MsgBox(Principale.BoxLibellé.Text)
            If NCompte.Text = "" Then
                If Coche.Checked = True Then
                    Compte = InputBox("Entrer le numéro de compte", "", "")
                Else
                    Compte = "0"
                End If
            End If
            Mot = Résultat.Text
            If Coche.Checked = True Then
                Compte = NCompte.Text
            Else
                Compte = "0"
            End If
            Label5.Text = "Le mot de passe pour " & Organisation & " est enregistré et le nom de l'organisation est contenu dans le presse-papier."
            'Enregistrement du mot de passe dans le presse-papier
            Clipboard.Clear()
            Clipboard.SetText(Mot)
            Principale.Password.Text = Résultat.Text
            Label5.Visible = True
            My.Computer.Audio.Play("Twibiw.wav", AudioPlayMode.Background)
            Résultat.Text = ""
            Référence.Text = ""
            NCompte.Text = ""
            NCompte.Visible = False
            Label7.Visible = False
            Coche.Visible = False
            TableDesDonnées.Show()
        End Sub


    Et voici la procédure précédente qui crée un mot de passe, et que je soupçonne de consommer une grande quantité de mémoire :

    Private Sub Go_Click(sender As Object, e As EventArgs) Handles Go.Click
            Dim Aléatoire As New Random
            Dim LongueurFixée As Integer = Aléatoire.Next(CInt(LongueurMini.Text), CInt(LongueurMaxi.Text) + 1)
            Dim Caractère As String = ""
            Dim Nombre As Integer
    
            Res.Text = LongueurFixée.ToString
            Label4.Text = "Résultat :"
            Label5.Visible = False
            Mot = ""
            'Premier caractère
            If CheckBox1.Checked = True Then
                Dim Aléatoire1 As New Random()
                Caractère = Chr(Aléatoire1.Next(65, 91))                                'Sortir un caractère défini par chr(x), x étant compris entre 65 et 91.
                Mot = Caractère
            End If
            'Autres caractères
            Dim Aléatoire2 As New Random()
            Do
                'Pile ou face
                If RadioButton1.Checked = False Then
                    Dim Tirage As Integer = Aléatoire2.Next(1, 5)                   'Sortir un caractère défini par chr(x), x étant compris entre 1 et 4 (bornes incluses).
                    Select Case Tirage
                        Case Is = 1 'Chiffres
                            Caractère = Chr(Aléatoire2.Next(48, 58))                    ' Chiffre compris entre 0 et 5.
                        Case Is = 2 'Majuscules
                            Caractère = Chr(Aléatoire2.Next(65, 91))                     ' Caractère entre "A" et "Z" (Majuscule, bornes comprises).
                        Case Is = 3 'Minuscules
                            Caractère = Chr(Aléatoire2.Next(97, 123))                   ' Caractère compris entre "a" et "z" (Minuscule, bornes comprises).
                        Case Is = 4 'Symboles
                            Caractère = Chr(Aléatoire2.Next(35, 39))                       ' Caractère parmi ("#", "$", "%" et "&").
                    End Select
                Else
                    Dim Tirage As Integer = Aléatoire2.Next(1, 4)                       'Sortir un caractère défini par chr(x), x étant compris entre 1 et 3 (bornes incluses).
                    Select Case Tirage
                        Case Is = 1 'Chiffres
                            Caractère = Chr(Aléatoire2.Next(48, 58))                          ' Caractère entre "A" et "Z" (Majuscule, bornes comprises).
                        Case Is = 2 'Majuscules
                            Caractère = Chr(Aléatoire2.Next(65, 91))                            ' Caractère entre "A" et "Z" (Majuscule, bornes comprises).
                        Case Is = 3 'Minuscules
                            Caractère = Chr(Aléatoire2.Next(97, 123))                        ' Caractère compris entre "a" et "z" (Minuscule, bornes comprises).
                    End Select
                End If
                Mot = Mot & Caractère
                Nombre = Nombre + 1
                Randomize()                                                                                                 ' change la graine
            Loop Until Nombre = LongueurFixée - 1
            Résultat.Text = Mot
            Enregistrement.Visible = True
            Résultat.Visible = True
            Référence.Visible = True
            Label4.Visible = True
            Label6.Visible = True
            Résultat.BackColor = Color.Maroon
            'Enregistrement du mot de passe dans le presse-papier
            Clipboard.Clear()
            Clipboard.SetText(Mot)
            Principale.Password.Text = Mot
            Label5.Text = "Ce mot de passe est maintenant contenu dans le presse-papier"
            Label5.Visible = True
            My.Computer.Audio.Play("Twibiw.wav", AudioPlayMode.Background)
        End Sub

    Merci de vous intéresser à mon problème.

    Pierre Allemand


    Pierre Allemand

    vendredi 4 septembre 2020 22:04
  • Bonjour Pierre, 

    De ce code donné, on ne voit pas comment et où est créé l'objet "TableDesDonnées".
    Si "TableDesDonnées" est dans un autre projet ou espace de nom, il doit avoir une référence vers lui dans ce code. Bien que, dans ce cas cela doive donner une erreur au cours du build. 
    Pouvez-vous donner le contenu complet du message d'erreur? 

    Cordialement,
    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 9 septembre 2020 10:23
    Modérateur
  • Voici le fichier "TableDesDonnées.designer.vb :

    Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
    Partial Class TableDesDonnées
        Inherits System.Windows.Forms.Form
    
        'Form remplace la méthode Dispose pour nettoyer la liste des composants.
        <System.Diagnostics.DebuggerNonUserCode()>
        Protected Overrides Sub Dispose(ByVal disposing As Boolean)
            Try
                If disposing AndAlso components IsNot Nothing Then
                    components.Dispose()
                End If
            Finally
                MyBase.Dispose(disposing)
            End Try
        End Sub
    
        'Requise par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
    
        'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée à l'aide du Concepteur Windows Form.  
        'Ne la modifiez pas à l'aide de l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()>
        Private Sub InitializeComponent()
            Me.components = New System.ComponentModel.Container()
            Dim DataGridViewCellStyle1 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
            Me.DataGrid1 = New System.Windows.Forms.DataGridView()
            Me.MenuStrip1 = New System.Windows.Forms.MenuStrip()
            Me.SortirToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
            Me.ConfirmerToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
            Me.CopierToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
            Me.Timer1 = New System.Windows.Forms.Timer(Me.components)
            CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
            Me.MenuStrip1.SuspendLayout()
            Me.SuspendLayout()
            '
            'DataGrid1
            '
            Me.DataGrid1.AllowDrop = True
            DataGridViewCellStyle1.BackColor = System.Drawing.Color.FromArgb(CType(CType(192, Byte), Integer), CType(CType(255, Byte), Integer), CType(CType(255, Byte), Integer))
            Me.DataGrid1.AlternatingRowsDefaultCellStyle = DataGridViewCellStyle1
            Me.DataGrid1.BackgroundColor = System.Drawing.Color.MistyRose
            Me.DataGrid1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
            Me.DataGrid1.Location = New System.Drawing.Point(1, 23)
            Me.DataGrid1.Name = "DataGrid1"
            Me.DataGrid1.Size = New System.Drawing.Size(865, 614)
            Me.DataGrid1.TabIndex = 0
            '
            'MenuStrip1
            '
            Me.MenuStrip1.BackColor = System.Drawing.Color.DarkOrange
            Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.SortirToolStripMenuItem, Me.ConfirmerToolStripMenuItem, Me.CopierToolStripMenuItem})
            Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
            Me.MenuStrip1.Name = "MenuStrip1"
            Me.MenuStrip1.Size = New System.Drawing.Size(874, 24)
            Me.MenuStrip1.TabIndex = 1
            Me.MenuStrip1.Text = "MenuStrip1"
            '
            'SortirToolStripMenuItem
            '
            Me.SortirToolStripMenuItem.ForeColor = System.Drawing.SystemColors.ButtonHighlight
            Me.SortirToolStripMenuItem.Name = "SortirToolStripMenuItem"
            Me.SortirToolStripMenuItem.Size = New System.Drawing.Size(54, 20)
            Me.SortirToolStripMenuItem.Text = "Retour"
            '
            'ConfirmerToolStripMenuItem
            '
            Me.ConfirmerToolStripMenuItem.Name = "ConfirmerToolStripMenuItem"
            Me.ConfirmerToolStripMenuItem.Size = New System.Drawing.Size(73, 20)
            Me.ConfirmerToolStripMenuItem.Text = "Confirmer"
            '
            'CopierToolStripMenuItem
            '
            Me.CopierToolStripMenuItem.Name = "CopierToolStripMenuItem"
            Me.CopierToolStripMenuItem.Size = New System.Drawing.Size(54, 20)
            Me.CopierToolStripMenuItem.Text = "Copier"
            '
            'Timer1
            '
            Me.Timer1.Interval = 2000
            '
            'TableDesDonnées
            '
            Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
            Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
            Me.ClientSize = New System.Drawing.Size(874, 640)
            Me.Controls.Add(Me.DataGrid1)
            Me.Controls.Add(Me.MenuStrip1)
            Me.MainMenuStrip = Me.MenuStrip1
            Me.Name = "TableDesDonnées"
            Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
            Me.Text = "Archive des mots de passe"
            Me.TopMost = True
            CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
            Me.MenuStrip1.ResumeLayout(False)
            Me.MenuStrip1.PerformLayout()
            Me.ResumeLayout(False)
            Me.PerformLayout()
    
        End Sub
        Friend WithEvents DataGrid1 As System.Windows.Forms.DataGridView
        Friend WithEvents MenuStrip1 As System.Windows.Forms.MenuStrip
        Friend WithEvents SortirToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
        Friend WithEvents ConfirmerToolStripMenuItem As ToolStripMenuItem
        Friend WithEvents CopierToolStripMenuItem As ToolStripMenuItem
        Friend WithEvents Timer1 As Timer
    End Class

    Et voici le message d'erreur :



    Pierre Allemand

    jeudi 10 septembre 2020 21:14
  • Comme je n'ai pas de réponse ou de suite à mes éléments de réponse, je ferme ma question sur ce forum.

    Pierre Allemand


    samedi 3 octobre 2020 16:21