none
[VB.NET] Access Violation Exception quand enregistrement image RRS feed

  • 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 

     

    Edit : mise en forme
    • 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
    samedi 7 mai 2011 10:59

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.
    dimanche 8 mai 2011 09:51
  • Merci pour ton aide ! J'avais déjà essayé la ligne que tu me propose mais le problème c'est qu'elle me génère une autre erreur : "exception ArgumentException" toujours sur la même ligne. Donc je dois changer d'autre choses si je met un "dispose" ? Merci.
    dimanche 8 mai 2011 12:35
  • Excusez-moi d'upper le sujet ... !

    Mais comme ça fait deux jours je me permet :-/

    Personne n'a d'idée pour venir à bout de "ArgumentException" ou alors de "AccessViolationException" ? 

    Merci.

    mardi 10 mai 2011 10:00
  • 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
    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    mercredi 11 mai 2011 12:43
  • 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.

     

    vendredi 13 mai 2011 05:45
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.

    vendredi 13 mai 2011 08:48
  • 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".
    vendredi 13 mai 2011 11:22
    Modérateur
  • 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


    Suivez MSDN sur Twitter   Suivez MSDN sur Facebook


    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.


    lundi 16 mai 2011 07:27
  • bonjoure je ne sais pas comment ont fais pour télécharger se gor de photo piuje avoire de l'aide please
    mercredi 6 juillet 2011 17:52
  • 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.

    dimanche 30 mars 2014 09:51