Pb stack overflow dans un array

Le
Korben
Bonjour,

Le Redime me pose ce pb de dépassement de mémoire ??
Pourtant j' ai mis en var global et en plus j' ai fais un erase du array .
Length varie entre 200 et 9000
La proc est ds un thread.
Et en plus il ne catch pas il fait systématiquement une exception à la Re
Dim ??



Private m_donnees() As Byte

Private Sub Recep(ByVal Data As Byte(), ByVal Length As Integer) Handles
MySock.ReceiveDataSocket

Erase m_donnees

Try
ReDim m_donnees(Length - 2)
Catch ex As Exception
MsgBox("Attn lack of memories " & Length & " , risk to lost
data " & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical, "Error")
End Try

End Sub

Merci de vos aides.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrice
Le #12196871
Mon premier mouvement est que si la structure doit être retaillée
fréquemment, il faut sans doute revoir la conception...

Combien de fois ce tableau est-il retaillé ? La taille me parait loin d'être
monstrueuse mais si cet appel est fait de nombreuses fois... En plus comme
il y a un byval le tableau de départ est copié sur la pile (et c'est
peut-être là que l'exception survient ???). Si il est effacé, il pourrait
sans doute être local et dimensionné directement.

Personnellement je lirais les données dans un buffer de taille fixe (ou au
pire j'agrandirais ce buffer lorsque nécessaire, inutile de le réduire si il
risque de devoir être agrandi à nouveau le coup d'après) ce qui ne générera
plus aucune allocation alors qu'ici on a une allocation à chaque réception.


--
Patrice

"Korben" discussion :
Bonjour,

Le Redime me pose ce pb de dépassement de mémoire ??
Pourtant j' ai mis en var global et en plus j' ai fais un erase du array .
Length varie entre 200 et 9000
La proc est ds un thread.
Et en plus il ne catch pas il fait systématiquement une exception à la Re
Dim ??



Private m_donnees() As Byte

Private Sub Recep(ByVal Data As Byte(), ByVal Length As Integer) Handles
MySock.ReceiveDataSocket

Erase m_donnees

Try
ReDim m_donnees(Length - 2)
Catch ex As Exception
MsgBox("Attn lack of memories " & Length & " , risk to lost
data... " & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical,
"Error")
End Try

End Sub

Merci de vos aides.



Korben
Le #12196861
Humm bizarre,

En effet l evenement se déclanche successivement, puis fait une exception à
la redim,
j ai essaye de mette en fix Dim , c est pareille. Si le tableau est en local
c est pire je tombe vite en erreur.
Le pgm envoie et recoit des donnees par la class socket.
Si le client et le serveur se trouve sur le meme pc j arrive à recevoir 1.5
meg.
S ils se trouvent sur 2 pc différent je recoit bcp plus 11meg.
S' en doute un pb de pile d'appel.
On ne va pas qd même vider la pile ?



"Patrice"
Mon premier mouvement est que si la structure doit être retaillée
fréquemment, il faut sans doute revoir la conception...

Combien de fois ce tableau est-il retaillé ? La taille me parait loin
d'être monstrueuse mais si cet appel est fait de nombreuses fois... En
plus comme il y a un byval le tableau de départ est copié sur la pile (et
c'est peut-être là que l'exception survient ???). Si il est effacé, il
pourrait sans doute être local et dimensionné directement.

Personnellement je lirais les données dans un buffer de taille fixe (ou au
pire j'agrandirais ce buffer lorsque nécessaire, inutile de le réduire si
il risque de devoir être agrandi à nouveau le coup d'après) ce qui ne
générera plus aucune allocation alors qu'ici on a une allocation à chaque
réception.


--
Patrice

"Korben" de discussion :
Bonjour,

Le Redime me pose ce pb de dépassement de mémoire ??
Pourtant j' ai mis en var global et en plus j' ai fais un erase du array
.
Length varie entre 200 et 9000
La proc est ds un thread.
Et en plus il ne catch pas il fait systématiquement une exception à la Re
Dim ??



Private m_donnees() As Byte

Private Sub Recep(ByVal Data As Byte(), ByVal Length As Integer) Handles
MySock.ReceiveDataSocket

Erase m_donnees

Try
ReDim m_donnees(Length - 2)
Catch ex As Exception
MsgBox("Attn lack of memories " & Length & " , risk to lost
data... " & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical,
"Error")
End Try

End Sub

Merci de vos aides.






Patrice
Le #12196851
Se pourrait il que tu recoives des tas d'évènement en même temps ? Je n'ai
pas trouvé trace de cet évènement dans la doc... D'après moi si tout est
toujours libéré correctement on ne devrait pas avoir de soucis, .NET se
chargeant de la "garbage collection".

Après, il reste sans doute préférable sur le plan du principe d'éviter de
réallouer de la mémoire trop souvent. A quoi sert ce tableau ? N'est il pas
possible d'utiliser celui qui est déjà fourni par la méthode ?

Egalemen tu parles de thread. As tu essayé les méthodes asynchrones déjà
fournies je pense par cette classe ?

Au delà difficile je pense de se passer de faire une petite maquette utlta
simplifiée (avais tu du code qui fonctionnait avant une précédente
modification ?) qui permettrait :
- soit de trouver le problème à force de simplifier le code
- soit de poster un code simplifié qui montre le problème pour que qq puisse
y jeter un oeil.

Il est essential que le code soit simplifié car personne n'aura envie de
parcourir des tas de lignes de code n'ayant rien à voir avec le problème
pour trouver qq chose qui ne va pas...

Bon courage et désolé pour le peu d'aide que je t'apporte...

--
Patrice



"Korben" discussion :
Humm bizarre,

En effet l evenement se déclanche successivement, puis fait une exception
à la redim,
j ai essaye de mette en fix Dim , c est pareille. Si le tableau est en
local c est pire je tombe vite en erreur.
Le pgm envoie et recoit des donnees par la class socket.
Si le client et le serveur se trouve sur le meme pc j arrive à recevoir
1.5 meg.
S ils se trouvent sur 2 pc différent je recoit bcp plus 11meg.
S' en doute un pb de pile d'appel.
On ne va pas qd même vider la pile ?



"Patrice"
Mon premier mouvement est que si la structure doit être retaillée
fréquemment, il faut sans doute revoir la conception...

Combien de fois ce tableau est-il retaillé ? La taille me parait loin
d'être monstrueuse mais si cet appel est fait de nombreuses fois... En
plus comme il y a un byval le tableau de départ est copié sur la pile (et
c'est peut-être là que l'exception survient ???). Si il est effacé, il
pourrait sans doute être local et dimensionné directement.

Personnellement je lirais les données dans un buffer de taille fixe (ou
au pire j'agrandirais ce buffer lorsque nécessaire, inutile de le réduire
si il risque de devoir être agrandi à nouveau le coup d'après) ce qui ne
générera plus aucune allocation alors qu'ici on a une allocation à chaque
réception.


--
Patrice

"Korben" de discussion :
Bonjour,

Le Redime me pose ce pb de dépassement de mémoire ??
Pourtant j' ai mis en var global et en plus j' ai fais un erase du array
.
Length varie entre 200 et 9000
La proc est ds un thread.
Et en plus il ne catch pas il fait systématiquement une exception à la
Re Dim ??



Private m_donnees() As Byte

Private Sub Recep(ByVal Data As Byte(), ByVal Length As Integer) Handles
MySock.ReceiveDataSocket

Erase m_donnees

Try
ReDim m_donnees(Length - 2)
Catch ex As Exception
MsgBox("Attn lack of memories " & Length & " , risk to lost
data... " & ex.Message, MsgBoxStyle.OkOnly Or MsgBoxStyle.Critical,
"Error")
End Try

End Sub

Merci de vos aides.










Publicité
Poster une réponse
Anonyme