Mon application de capture vidéo monte en flêche niveau mémoire

Résolu
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 7 mai 2013 - 22 juin 2011 à 11:33
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 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

9 réponses

boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 7 mai 2013
22 juin 2011 à 14:50
C'est bon, le problème vient de la pictureBox, il faut vider l'image présente dedans avant de la recharger :

If Not (Camera1.Image Is Nothing) Then
Camera1.Image.Dispose()
Camera1.Image = Nothing
End If

J'ai remis le Timer à 100ms et c'est Ok.

Merci encore 4u4me4us.


Boliv
3
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
22 juin 2011 à 11:54
Utilises- tu un timer ?
Si oui veille à ce qu'il est un temps adapté (0.0 miliseconde n'est pas un temps adapté).
0
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Derniè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.

Boliv
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Derniè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 ;)
0
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 7 mai 2013
22 juin 2011 à 14:33
Encore mieux !
Finalement c'est simplement le chargement de la pictureBox qui pose problème.
Lorsque je fais :

Camera1.image = Image.FromFile ("Image1.png")

j'obtiens le même résultat.


Boliv
0
Mayzz Messages postés 2813 Date d'inscription mardi 15 avril 2003 Statut Membre Dernière intervention 2 juin 2020 28
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.
0
boliv Messages postés 11 Date d'inscription vendredi 13 juin 2003 Statut Membre Derniè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 ....

Boliv
0
4u4me4us Messages postés 780 Date d'inscription lundi 22 janvier 2007 Statut Membre Dernière intervention 30 octobre 2013 3
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.
0
Rejoignez-nous