boliv
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 7 mai 2013
-
22 juin 2011 à 11:33
4u4me4us
Messages postés780Date d'inscriptionlundi 22 janvier 2007StatutMembreDernière intervention30 octobre 2013
-
22 juin 2011 à 15:43
Bonjour à tous,
Je développe actuellement une application de capture vidéo en temps réel. Pour cela , j'utilise une caméra que j'interroge via un webclient. Je récupère un stream que je converti en image. L'application fonctionne très bien.
Mon problème est qu'à chaque fois que j'appelle ma fonction de capture, mon application prend 1,5 Mo en mémoire. J'ai pourtant essayer les close(), les dispose, les Nothing, rien n'y fait, l'application monte en rame jusqu'à atteindre les 300 Mo puis .... elle retombe à 0.
Je pense qu'il me manque quelques fondements .Net, ou alors, il y a quelques chose que je ne vois pas dans ma fonction et qui pourtant est gros comme un éléphant ...
Je demande donc votre aide ....
Voici la fonction :
Private Function DownloadImage(ByVal url As String) As Image
Dim ErreurWeb As WebExceptionStatus
Try
Dim str As Stream
Dim client As New WebClient()
str = client.OpenRead(url)
DownloadImage = Image.FromStream(str)
str.Close()
client.Dispose()
client = Nothing
Exit Function
Catch e As WebException
ErreurWeb = e.Status
Return Image.FromFile("ConnexionImpossible.png")
Catch e As Exception
MessageBox.Show(e.Message, "Erreur Système", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return Image.FromFile("ConnexionImpossible.png")
End Try
End Function
Boliv
A voir également:
Mon application de capture vidéo monte en flêche niveau mémoire
boliv
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 7 mai 2013 22 juin 2011 à 12:04
Effectivement, j'utilise un timer, il est réglé à 100ms.
Ce timer me permet de lire sur une carte d'acquisition PCI les informations d'entrée automate (bits).
Lorsqu'un bit est à 1 (en gros lorsque l'on me demande de prendre une photo), je fais appel à cette fonction pour récupérer l'image dans la caméra.
Ma fonction est donc appelé dans le Tick du timer mais elle n'est appelé que sur un changement d'état.
4u4me4us
Messages postés780Date d'inscriptionlundi 22 janvier 2007StatutMembreDernière intervention30 octobre 20133 22 juin 2011 à 13:13
Teste la démarche suivante.
Juste avant l'appelle de la fonction étain le timer (eneabel = false)
Appelle la fonction
Juste après la fonction place réenclenche le timer (eneabel = timer)
Normalement cela devrait faire baisser les Mo mais peut perturber le fonctionnement générale de l'appli. Si rien de mieux place un doevents après l'appelle de la fonction
Vous n’avez pas trouvé la réponse que vous recherchez ?
boliv
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 7 mai 2013 22 juin 2011 à 14:27
Je viens de tester. Mais le résultat est le même. Avant de créer des événements, j'ai testé autre chose qui montre que cela ne vient pas du timer.
J'ai mis le Timer à Enable = False, puis j'ai créer un bouton dans le quel j'ai ajouté le script suivant :
Camera1.image = DownloadImage (LienImageCamera1)
Où Camera1 est une PictureBox et LienImageCamera1 un string contenant le lien URL de la camera.
Et le résultat est le même, à chaque pression sur le bouton, l'application monte en mémoire.
Boliv
PS : Merci 4u4me4us pour ta participation ;)
Mayzz
Messages postés2813Date d'inscriptionmardi 15 avril 2003StatutMembreDernière intervention 2 juin 202028 22 juin 2011 à 14:55
Salut,
Sous quel système est le PC sur lequel tourne le programme ? Parce que selon les OS la mémoire est gérée différemment. Il se peut que les adresse soient marquées comme libre mais que les blocs contiennent encore les données.
Je ne suis pas un accro du C++ et autres langages plus hardware donc je ne sais pas trop comment fonctionne ce mécanisme, mais ton application n'est peut être pas en cause et le problème n'en est peut être pas un.
Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
boliv
Messages postés11Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 7 mai 2013 22 juin 2011 à 15:06
Je travaille sous Win7 Pro. Mais effectivement, au bout de quelques minutes la mémoire se libérait, elle passait de 300Mo à 20ko !!
Mais je ne pouvais laisser mon application monter si vite ....
4u4me4us
Messages postés780Date d'inscriptionlundi 22 janvier 2007StatutMembreDernière intervention30 octobre 20133 22 juin 2011 à 15:43
Tant mieux Boliv !! G pensé au timer car j'avais un code qui me saturer le PC quand je le lancer et mon problème était que j'avais négliger le trimer. Bonne suite bon code.