Auteur de questions
[VB.NET] Access Violation Exception quand enregistrement image

Discussion générale
-
Bonjour à tous !
Je reviens une seconde fois vers la communauté microsoft pour un problème (plus simple il me semble), mais que je n'ai pas réussi à résoudre...
Avec Direct X, je stream le contenu d'une webcam dans une picturebox, le but est ensuite de prendre des photos de la PictureBox toutes les deux secondes pour les enregistrer sous le même nom (la nouvelle vient écraser la précédente).
Le but final étant d'afficher la webcam en ligne avec un taux de rafraichissement de 1 image toutes les 2 secondes (JS se charge de la réactualiser tous les 200 millisecondes).
Seulement j'ai l'impression - arrêter moi si je me trompe - que l'ordinateur n'est pas assez rapide et qu'il tente de réécrire sur l'image avant même d'avoir fini la capture d'avant. Quand j'augmente le délai à 5 secondes j'ai un peu plus de temps mais l'erreur fini quand même par arriver.
L'erreur obtenu est "System.AccessViolationException: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."
Les lignes de code concernées sont les suivantes :
Dim la As PictureBox = CType(Sender, PictureBox) la.image.save("capture.jpg")
L'erreur se produit au niveau de la deuxième ligne
Avez vous une idée de comment ignorer/mettre fin à cette erreur ? J'ai essayé try/catch pour l'ignorer mais l'erreur est trop importante et Windows crash le programme et propose d'envoyer un rapport d'erreur.
Je vous remercie.
Félix M.
PS : J'ai déjà essayer de mettre quelque chose dans le genre mais sans succès :
if pas_deja_entrain = 0 Then<br/>pas_deja_entrain = 1
Dim la As PictureBox = CType(Sender, PictureBox) la.image.save("capture.jpg")<br/>pas_deja_entrain = 0
End If- Type modifié -Felix mardi 10 mai 2011 10:01
- Type modifié Ciprian Duduiala mardi 17 mai 2011 05:57 pas de réponse de l'utilisateur qui a lancé la question
Toutes les réponses
-
Bonjour,
En effet ce problème arrive très souvent lorsqu'on manipule les images.
Tout dépend de l'organisation du code mais souvent c'est une ressource qui n'est pas libérée.
Ainsi, à chaque sauvegarde de l'image, il faut disposer l'image :
Dim la As PictureBox = CType(Sender, PictureBox) la.image.save("capture.jpg")
la.Image.Dispose()Peut-être que le problème vient de là.
N'hésitez pas à poser des questions si un problème subsiste ou quelque chose n'est pas clair. Dans l'autre cas, veuillez indiquer que le problème est résolu. Lien utile : Cordialement - Best Regards. -
-
-
Bonjour,
Les deux erreurs (Argument Exception et AccessViolation Exception) sont assez générales et on a besoin de plus de détails (utilisez un block try-catch, par exemple). Sinon, pour quoi vous n’essayez pas à sauvegarder les images avec des noms différents (« capture_HHmmss.jpg », par exemple) pour éviter cette erreur et puis après un certain temps vous supprimez les captures.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
Bonjour,
Comme je l'ai dit plus haut j'ai déjà essayé avec les try/catch mais l'erreur provoque un "rapport d'envoi d'erreur" et le programme crash complètement; apparement ce n'est pas une erreur que l'on peut "contenir" dans un try/catch.
Non je ne peux pas l'enregistrer sous un autre nom car le système JS actualise toutes les 200ms le fichier capture.jpg il ne peut pas savoir si un coup il doit afficher capture1 puis après capture2 etc.
Le but étant d'envoyer en ligne les images d'une webcam de manière assez rapide.
Merci pour ton aide... Mais il doit bien exister une piste non ? Même quand je met une fréquence de 10 secondes entre chaque image je finis par avoir une erreur au bout d'un moment ! C'est normal que ce soit si long que ça ? Mon image est en très basse résolution en plus.
-
Bonjour,
Il est difficile résoudre votre problème ou reproduire le contexte de votre erreur avec les informations qu’on a. Comme j’ai déjà dit les deux erreurs sont assez générales. Pouvez-vous nous montrer plus de votre code. Je voudrai savoir quel est l’évènement utilisée pour enregistrer la nouvelle image et un il nous aidera aussi savoir un peu plus sur le système JS qui fait l’actualisation. Est-il possible d’avoir l’accès bloqué vers le fichier ‘capture.jpg’ par ce système ?
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT  
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.
-
Bonjour,
Est-ce que cela ne pourrait pas arriver si la mise à jour de la picture box se fait d'un côté pendant que l'on déclenche la sauvegarde de l'autre ? Je pense qu'au lieu de faire la sauvegarde indépendamment je ferais plutôt qq chose du style quand je recupère l'image, je regarde combien de temps s'est écoulé depuis la dernière sauvegarde et je copie directement l'image que je viens de recevoir, la picture box ne servant plus qu'à l'affichage final.
Cela devrait éviter de solliciter la picture box en même temps pour une mise à jour et une sauvegarde. (ou utiliser SyncLock). Comment se font la sauvegarde la pciture box et sa mise à jour par une nouvelle image ?
Please always mark whatever response solved your issue so that the thread is properly marked as "Answered". -
Bonjour, Felix,
Est-ce que vous avez testé la solution proposée par Patrice ? Merci pour partager avec nous les résultats, afin que d'autres personnes avec le même problème puissent profiter de cette solution.
Cordialement,
Cipri
Ciprian DUDUIALA, MSFT
•Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte. -
-
bonjour je debut seulement en vb mé fort d'experience en qb je me demande si tu ne devré pas couper ta cam pour enregistré ta capture. ton probleme vient peut etre du fait que ton image et exploité 2x en meme temp,
ou il existe peut etre en vb un system de gestion derreur au lieu de coupé la cam.