Mon application de capture vidéo monte en flêche niveau mémoire [Résolu]

Signaler
Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013
-
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
-
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

Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013

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

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
Messages postés
781
Date d'inscription
lundi 22 janvier 2007
Statut
Membre
Dernière intervention
30 octobre 2013
3
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
Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013

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 ;)
Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013

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
Messages postés
2814
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
36
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.
Messages postés
11
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
7 mai 2013

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