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 erreur (memoire insuffisante) [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut VB.NET erreur (memoire insuffisante)
    Bonjour

    merci de m aider sur mon problème.


    j ai crée un logiciel qui donne la possibilité de modifier une image pour y ajouter des icones ou du texte.
    mais je reçois un message d'erreur : (System.OutOfMemoryException' occurred in System.Drawing.dll)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    Private Sub pbim_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbim.MouseMove
    ...
    ...
    ...
     image1 = New Bitmap(image2)
     
                g = Graphics.FromImage(image1)
     
                Try
                    If txtrt.Text = "" Then
     
                        ang = 0
                    Else
                        ang = txtrt.Text
                    End If
                Catch ex As Exception
                    ang = 0
                End Try
     
                TextBox2.Text = ofdm.FileName.ToString
                Dim angrad As Double = (ang * (Math.PI / 100)) + 100
                poMatrix = New System.Drawing.Drawing2D.Matrix()
                poMatrix.Rotate(ang)
     
                transState = g.Save()
     
                g.Transform = poMatrix
                g.TranslateTransform(varax, varby, System.Drawing.Drawing2D.MatrixOrder.Append)
     
                Dim string_format As New StringFormat
                string_format.Alignment = StringAlignment.Center
                string_format.LineAlignment = StringAlignment.Center
                g.DrawString(txtcc.Text, New Font("Arial", 10.0F), Brushes.Black, 0, 0, string_format)
                g.Save()
                pbim.Image = image1
                pbim.Refresh()
     
                g.Dispose()
    End Sub

  2. #2
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 95
    Points : 264
    Points
    264
    Par défaut
    Bonjour,

    Est-ce que tu peux indiquer exactement quelle instruction plante via le mode pas à pas de Visual Studio?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2012
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2012
    Messages : 206
    Points : 455
    Points
    455
    Par défaut
    Bonjour,

    Je dirais que ton image1n'est pas disposé non plus.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Faut pas chercher plus loin...

    L'évènement est déclenché à chaque fois que la souris bouge d'un pixel (bon, p-e d'un pixel même, quand elle bouge de 2 cm, ça fait déjà un paquet d'occurences!).

    Et dans l’événement, tu crées à chaque fois une nouvelle image en mémoire sans jamais la supprimer.

    Alors forcément, au bout d'un moment, bin y a plus de place...

    Ajoute s'implement un image1.Dispose à la fin et ça ira déjà mieux.

    Ou mieux tu peux utiliser un bloc Using qui, dans ton cas, ce déclare comme suit : Using image1 As New Bitmap(image2).

    Et ne pas oublier le End Using à la fin mais bon, VS te rappellera à l'ordre.

    Plus d'info sur le bloc using ici.

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut merci des reponses
    Merci de toutes vos réponses.

    Mr kropernic merci de votre réponse:
    je vais tester votre idée pour vérifier la pertinence. je me disais quand on crée une variable en lui réserve une place dans la mémoire. Alors si les changement ce multiplie c'est les mêmes cases mémoire qui sont utilisé. Quesque vous on pensez Mr kropernic?

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par s080s Voir le message
    Merci de toutes vos réponses.

    Mr kropernic merci de votre réponse:
    je vais tester votre idée pour vérifier la pertinence. je me disais quand on crée une variable en lui réserve une place dans la mémoire. Alors si les changement ce multiplie c'est les mêmes cases mémoire qui sont utilisé. Quesque vous on pensez Mr kropernic?
    Déjà, laisse tomber le monsieur ! Sinon je ne réponds plus :p

    Sinon concernant la variable, à chaque fois qu'il y a le mot NEW, c'est un nouvel objet et donc, une nouvelle zone mémoire.

    Si je fais quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim img1 as New Bitmap()
    img1 = New Bitmap()
    img1 = New Bitmap()
    En mémoire, je vais avoir 3 objets de type Bitmap mais je ne pourrai accéder qu'au dernier via la variable nommée img1.

    Après, y a le GC (Garbage Collector) qui passe de temps en temps pour nettoyer les objets vers lesquels il n'y a plus de références histoire de limiter la casse. Mais dans ton cas, vu que les instructions New s'enchaînent rapidement, le GC n'a pas le temps de venir faire son travail. Ce qui fait que ta mémoire se retrouve très vite saturée.

    En utilisant un bloc Using ou explicitement la méthode Dispose d'un objet, on indique en fait à l'OS (à confirmer que c'est bien à l'OS) qu'il peut réutiliser les zones mémoires que cet objet occupait. On récupère ainsi de la place.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 174
    Points : 25 115
    Points
    25 115
    Par défaut
    juste un petit détail, ce n'est pas à la fin de la sub qu'il faut disposer l'image, vu que tu l'affiches la disposer plantera aussi

    c'est avant de faire image1=new bitmap
    là dans la variable image1 tu vas mettre une nouvelle image, mais à partir du 2ème appelle il y a déjà un bitmap dans la variable (un autre) et c'est celui qu'il faut disposer
    comme dit précédemment une variable n'est qu'un pointeur vers un espace mémoire, le new créé un nouvel espace mémoire, et ta variable change juste de pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if image1 isnot nothing then image1.dispose
    image1 = new bitmap
    sinon g.save et pbim.refresh ne servent à rien à priori
    et si tu veux plus de performances tu peux draw sur l'event paint directement plutot que draw sur une image, qui elle même va faire l'objet d'un traitement pour être drawée lors de l'event paint
    enfin fini déjà de faire marcher le code comme ca

  8. #8
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    juste un petit détail, ce n'est pas à la fin de la sub qu'il faut disposer l'image, vu que tu l'affiches la disposer plantera aussi
    Ah oui bien vu !

  9. #9
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut merci de vos reponses
    Citation Envoyé par Pol63 Voir le message
    juste un petit détail, ce n'est pas à la fin de la sub qu'il faut disposer l'image, vu que tu l'affiches la disposer plantera aussi


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if image1 isnot nothing then image1.dispose
    image1 = new bitmap

    merci de cette réponse.
    j'ai combiner le code si dessus a la fonction using ... end using et l'erreur outofmemory a disparu.

    Maintenant un nouveau message apparait (Une exception non gérée du type 'System.ArgumentException' s'est produite dans System.Drawing.dll)
    et c'est toujours en relation avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     image1 = new bitmap(image2)
    permettez moi de vous expliquez l'utilité de mon application. j'essaye de crée une application qui donne a son utilisateur le droit d'écrire sur une image de MAP, a ajouter des icones pour faire des repère dans la MAP, de zoomer et d'enregistrer les changements.

    cette dernier exception ce déclenche si on ajoute des icones dans l'image puis on essaye d'écrire du texte. il me semble que image2 et image1 ne sont plus utilisable après la premier action.
    pouvez vous m'aider, SVP?
    faut il que j'ouvre une nouvelle discussion pour chercher de l'aide ?

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Redonne le code complet stp.

  11. #11
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Voici le code de l'evenement mousemove sur picturebox
    le code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    Private Sub pbim_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles pbim.MouseMove
     
            difgpw = picsw - (Math.Abs(picslx) + gbw)
            difgph = picsh - (Math.Abs(picsly) + gbh)
            picsh = pbim.Height
            picsw = pbim.Width
            picslx = pbim.Location.X
            picsly = pbim.Location.Y
            zmp = myy - MousePosition.Y
            varax = ((1780 * e.X) / picsw) - 5
            varby = ((2200 * e.Y) / picsh) - 30
     
            If rbcc.Checked = True Then
                If image1 IsNot Nothing Then image1.Dispose()
     
                image1 = New Bitmap(image2)
     
                g = Graphics.FromImage(image1)
                Try
                    If txtrt.Text = "" Then
                        ang = 1
                    Else
                        ang = txtrt.Text
                    End If
                Catch ex As Exception
                    ang = 1
                End Try
     
                TextBox2.Text = ofdm.FileName.ToString
                Dim angrad As Double = (ang * (Math.PI / 100)) + 100
                poMatrix = New System.Drawing.Drawing2D.Matrix()
                poMatrix.Rotate(ang)
     
                transState = g.Save()
     
                g.Transform = poMatrix
                g.TranslateTransform(varax, varby, System.Drawing.Drawing2D.MatrixOrder.Append)
     
                Dim string_format As New StringFormat
                string_format.Alignment = StringAlignment.Center
                string_format.LineAlignment = StringAlignment.Center
                g.DrawString(txtcc.Text, New Font("Arial", 10.0F), Brushes.Black, 0, 0, string_format)
     
                pbim.Image = image1
                pbim.Refresh()
     
                g.Dispose()
     
            ElseIf rbd.Checked = True Or rbp.Checked = True Or rbl.Checked = True Or rbhpr.Checked = True Or rbhpu.Checked = True Then
                If pbhpr.Visible = True Then
                    newimage = pbhpr.Image
     
                ElseIf pbhpu.Visible = True Then
                    newimage = pbhpu.Image
     
                ElseIf pbp.Visible = True Then
                    newimage = pbp.Image
     
                ElseIf pbl.Visible = True Then
                    newimage = pbl.Image
     
                ElseIf pbd.Visible = True Then
                    newimage = pbd.Image
                End If
                image1 = New Bitmap(image2)
                g = Graphics.FromImage(image1)
                Try
                    g.DrawImage(newimage, varax, varby, 50, 70)
                    g.Save()
                    pbim.Image = image1
     
     
                Catch ex As Exception
                    MsgBox(ex.Message, vbOK)
                End Try
            End If
     
            If btnalc.Text = "Sauvegarder" Then
                image3 = New Bitmap(image2)
                g = Graphics.FromImage(image3)
                g.DrawRectangle(Pens.Red, varax, varby, 250, 200)
                pbim.Image = image3
                pbim.Refresh()
     
     
            End If
            If TabControl1.SelectedIndex = 1 Then
                Dim bm As New Bitmap(180, 120)
     
                Using gr As Graphics = Graphics.FromImage(bm)
     
                    Dim src_rect As New Rectangle(varax, varby, 250, 200)
                    Dim dst_rect As New Rectangle(-1, -1, 180, 120)
     
     
                    gr.DrawImage(pbim.Image, dst_rect, src_rect, GraphicsUnit.Pixel)
                End Using
                pblou.Image = bm
            End If
            If difgph < 1 Then
                pbim.Location = New Point(picslx, picsly + 1)
                pbim.Refresh()
            End If
            If difgpw < 1 Then
                pbim.Location = New Point(picslx + 1, picsly)
                pbim.Refresh()
            End If
     
            If MouseButtons = Windows.Forms.MouseButtons.Left Then
     
                pbim.Location = New Point(MousePosition.X - mcx, MousePosition.Y - mcy)
     
            ElseIf MouseButtons = Windows.Forms.MouseButtons.Right Then
     
                If zmp <= 50 And zmp > 0 Then
     
                    If varaa <= 0 Then
                        pbim.Location = New Point(vara + 5, varb)
                        pbim.Height = picsh + 10
                        pbim.Width = picsw + 10
     
                    End If
                    If varbb <= 0 Then
                        pbim.Location = New Point(vara, varb + 5)
                        pbim.Height = picsh + 10
                        pbim.Width = picsw + 10
     
                    End If
                    If varaa >= 295 Then
                        pbim.Location = New Point(vara - 5, varb)
                        pbim.Height = picsh + 10
                        pbim.Width = picsw + 10
     
                    End If
                    If varbb <= 335 Then
                        pbim.Location = New Point(vara, varb - 5)
                        pbim.Height = picsh + 10
                        pbim.Width = picsw + 10
     
     
                    End If
     
     
                ElseIf zmp <= 0 And zmp > -50 And pbim.Height > 499 Then
     
                    If varaa <= 0 Then
                        pbim.Location = New Point(vara + 5, varb)
                        pbim.Height = picsh - 50
                        pbim.Width = picsw - 50
     
                    End If
                    If varbb <= 0 Then
                        pbim.Location = New Point(vara, varb + 5)
                        pbim.Height = picsh - 50
                        pbim.Width = picsw - 50
     
                    End If
                    If varaa >= 295 Then
                        pbim.Location = New Point(vara - 5, varb)
                        pbim.Height = picsh - 50
                        pbim.Width = picsw - 50
     
                    End If
                    If varbb <= 335 Then
                        pbim.Location = New Point(vara, varb - 5)
                        pbim.Height = picsh - 50
                        pbim.Width = picsw - 50
     
     
                    End If
                End If
            End If
        End Sub

    aussi j'ai constater que le problème disparait avec la suppression de la line :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If image1 IsNot Nothing Then image1.Dispose()

  12. #12
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Bah là comme ça, je vois pas trop.

    Le type de l'exception montre un problème avec les arguments. Cela ne peut donc venir que de image2 à priori. J'imagine qu'il s'agit d'une variable de type image ?

    Sinon, il y a aussi plus bas (dans le bloc Else) un ligne image1 = New Bitmap(image2). N'oublie pas de libérer la ressource actuellement occupée par image1 s'il y en a une.

    Essaie de voir dans les détails de l'exception qui générée. Tu auras peut-être plus d'info.

  13. #13
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Août 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Bah là comme ça, je vois pas trop.

    Le type de l'exception montre un problème avec les arguments. Cela ne peut donc venir que de image2 à priori. J'imagine qu'il s'agit d'une variable de type image ?

    Sinon, il y a aussi plus bas (dans le bloc Else) un ligne image1 = New Bitmap(image2). N'oublie pas de libérer la ressource actuellement occupée par image1 s'il y en a une.

    Essaie de voir dans les détails de l'exception qui générée. Tu auras peut-être plus d'info.
    Merci, je prendrais ce que vous avez dis en considération. maintenant j'étudie le langage C++ pour structurer mon programme et j'espère que ca vas donné un bon fruit.

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

Discussions similaires

  1. Excel erreur memoire insuffisante
    Par Noddles dans le forum Débuter
    Réponses: 0
    Dernier message: 06/01/2013, 15h43
  2. D2010 - Erreur memoire insuffisante
    Par SergioMaster dans le forum EDI
    Réponses: 4
    Dernier message: 21/07/2011, 13h57
  3. Erreur memoire insuffisante
    Par dragonfly80 dans le forum InterBase
    Réponses: 5
    Dernier message: 01/08/2008, 10h03
  4. Probleme VB6 et erreur 7 memoire insuffisante
    Par dubidon dans le forum Windows
    Réponses: 3
    Dernier message: 31/05/2006, 11h04
  5. [VB6] Erreur 7 memoire insuffisante ??
    Par dubidon dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 31/05/2006, 11h03

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