Bug au bou de quelque minutes de fonctionnement

Résolu
Signaler
Messages postés
12
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2007
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour à tous,

Je dois developper un petit logiciel qui réalise ces fonctions



            Lister les drivers des webcams et caméras installé le pc



            Détecter  les sources vidéo branchées sur l’ordinateur



            Sélectionner la source vidéo à capturer



            Configurer les paramètres de capture (débit images, format RGB24, I420, Résolution)



            Lancer la capture vidéo



            Découper la vidéo pour obtenir une Résolution carré



            Redimensionner les images en 12 par 12 pixels



            Appliquer un filtre noir et blanc à l’image


Pour appliquer les différents filtres sur mes images j'utilise la librairy windows system drawing. Mon programme fonctionne correctement mais au bout de quelque minutes il bug...
Message d'erreur:

Une exception non gérée du type 'System.UnauthorizedAccessException' s'est produite dans Microsoft.VisualBasic.dll


Informations supplémentaires : Accès refusé.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
 


 





<?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" /??>
<st1:metricconverter w:st="on" productid="0000066f">
0000066f
</st1:metricconverter>

  mov         dword ptr [ebp-28h],eax







La boucle de capture est la suivante et je pense qu'elle est la cause de cette erreur. Etant débutant je n'arrive pas à comprendre pourquoi (J'espere obtenir un petit d'aide pour comprendre ce probleme Merci a tous) :



Private



Sub
mWBCStream_Streamed(

ByRef
pBitMap

As
System.Drawing.Bitmap)

Handles
mWBCStream.Streamed



Compte = Compte + 1


picCur.Image = pBitMap


picCur.SizeMode = PictureBoxSizeMode.StretchImage



If
Compte = CompteRef

Then



'CompteRef = Nombre de capture de pBitMap



Compte = 0


picCur.Image.Save(FileA)







Img1.LoadFile(FileA)


''Application du filtre à l'image (couperImage)

Img1 = R11.Apply(Img1) '







''Création conteneur pour l'image à manipuler

Img2 = Img1







'Application du filtre à l'image (redimensionnerImage)

Img2 = R22.Apply(Img2)







'Verification de l'existance et destruction de la variable FileB


Resultat = Dir(FileB)


If
Resultat <>

""



Then

IfFileExists =




True

Kill(FileB)







Else

IfFileExists =




False






End



If






'Application du filtre à l'image (noir et blanc)

Img2.saveFile(FileB)


picCurT.Load(FileB)


Img4 = picCurT.Image


Witdthi = Img4.Width


Heighti = Img4.Height







For
x = 0

To
Witdthi - 1

Step
1


For
y = 0

To
Heighti - 1

Step
1pixelColor = Img4.GetPixel(x, y)

Rc = pixelColor.R()

Gc = pixelColor.G()

Bc = pixelColor.B()

Moy = (Rc + Gc + Bc) / 3

newColor = Color.FromArgb(Moy, Moy, Moy)


'newColor = Color.FromArgb(Rc, Rc, Rc)

Img4.SetPixel(x, y, newColor)







Next






Next

'Affichage de l'image dans la PictureBox



picCurF.Image = Img4


picCurF.SizeMode = PictureBoxSizeMode.StretchImage







'Test de performance

StatusBar.Text =




"fps="
& Format(mWBCStream.FPS,

"0.00"
) &

", perf="
& mWBCStream.GetPerf


End



If






End



Sub

Les déclarations

Dim A
As
Object
' Provisoir

Dim B
As
Integer
' Provisoir

Dim x, y
As
Integer

Dim Rc
As
Integer

Dim Gc
As
Integer

Dim Bc
As
Integer

Dim Moy
As
Integer

Dim Witdthi
As
Integer

Dim Heighti
As
Integer

Dim pixelColor
As Color

Dim newColor
As Color

Dim ptr
As System.IntPtr

Dim count
As
Long

Dim Img4
As Bitmap

Dim pixelformat
As System.Drawing.Imaging.PixelFormat

Dim IfFileExists
As
Boolean

Dim ppbitmap
As Bitmap

Dim Img1
As
Object

Dim Ip1
As
Object

Dim Img2
As
Object

Dim Ip2
As
Object

Dim Img3
As Bitmap

Dim Ip3
As
Object

Dim FileA
As
Long

Dim FileB
As
Long

Dim WidthCini
As
Integer

Dim Resultat
As
String

Dim Resultat1
As
Object

Dim Resultat2
As
Object

Dim Z
As
Integer

Dim R11
As
Object

Dim R22
As
Object

Dim R33
As
Object

Dim CompteRef
As
Integer

Dim Img5
As Bitmap

Dim uu
As Color

Dim i
As
Integer

Dim j
As
Integer

Friend
WithEvents NumericUpDown1
As System.Windows.Forms.NumericUpDown

Dim xxxx
As
Boolean

Dim xxxxx
As
Boolean

Dim Compte
As
Integer

4 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonsoir,

Es-tu réellement certain de développer sous VB6 ? (la présente section de ce forum)
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Je crains que certains aient réellement des difficultés ...
celà lui avait pourtant déjà été signalé ici :
http://www.vbfrance.com/infomsg_PICTUREBOX-SANS-LISSAGE-PIXEL_974960.aspx#7
VB.Net et VB6 ne sont pas la même "chose"
Messages postés
12
Date d'inscription
lundi 18 juin 2007
Statut
Membre
Dernière intervention
15 juillet 2007

Au temps pour moi jmfmarques, cette confusion devient très claire. Elle m'apporte en plus de solution pour mon projet (thread)... Désolé pour le dérangement et pour cette mal compréhension<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
15
Salut,

Arf. On dirait une bonne vielle segfault.

Pas moyen de récupérer plus d'infos avec le débogueur ?
Tu peux envoyer des chaines de caractères dans un fichier (Ou une console de débogage si il y a) pour cerner l'emplacement du problème si le débugueur ne s'en sort pas. Genre :
Point de contrôle
Bosse
Gauche légé
Droite dur
Freine
(Fans de V-Rally 1, bonjour !)

movdword ptr [ebp-28h],eax

C'est marrant qu'il se prenne une violation d'accès sur cette instruction... eax est toujours accessible, et ebp est pas sensé pointer dans l'hyper espace. En ebp-x, c'est génralement les variables locales aux fonctions. Donc ton ebp doit être mauvais. ebp, il lui arrive pas grand chose à part se faire empiler et dépiler en début et fin de routine :

push ebp
mov ebp, esp
...
mov esp, ebp
pop ebp

Donc de manière général, il a peu de chance que la valeur popée ne soit pas le ebp précédent. (Encore que le cas ou mov esp, ebp n'est pas employé est pas francchement rare.

Bref, il y a de bonne chance que la valeur de ebp soit celle qui se trouve à l'adresse où il a été pushé.

MAIS rien ne dit que cette valeur n'est pas changé entre temps...

Donc je dirais qu'on se trouve dans un cas de dépassement de tampon, ou des données trops grande pour rester dans l'espace réservé dans la pile sont allées recouvrir sauvagement tout ce qui se trouvait plus haut.

Une variable locale de fonction qui sert de tampon capable de contenir x octets dans lequel on met x+y octets quoi.

Si tu as une telle chose dans ton code, débouche le champomy (Vérifie tout ce qui est suceptible d'être un tampon, genre des endroits où tu as alloué 50 octets sans savoir si c'est ce qu'il allait falloire).

Dans le cas contraire, t'as lu mes divagations pour rien. Désolé.