Comment liberer la mémoire lors d'une boucle?

scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011 - 29 avril 2011 à 22:01
scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011 - 30 avril 2011 à 00:44
Voila, tout est dans le titre, j'exécute un programme qui traite et stoque des images bitmap dans des variables et j'aimerai bien vider la mémoire cache à chaque fin de boucle, car autrement mon programme plante au bout de quelques secondes.

8 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 avril 2011 à 22:23
Salut,

Il manque un bout de code.

Passe le programme a Fxcop Parexemple, il te dira quelles sont les ressources qui ne sont pas fermée peut etre.

Exemple, il faut fermer les ressources .Close();
et même faire un Dispose()

Tu peux aussi regarder du coté des weakreferences pour avoir des references faibles et
alleger le garbage collector
et evite d'appeler le garbage collector en direct

Bon courage.
0
scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011
29 avril 2011 à 22:32
Salut, j'ai deja fais un .Dispose(); mais apparament ca n'a pas arranger mon problème.

Tu peux me donner plus de détails sur Fxcop et weakreferences ? Ces noms ne me disent rien
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 avril 2011 à 22:44
As-tu bien fermer tes open ?
Utilises la syntaxe pour les ouvertures cela gere les close de facon plus propre

using (var conn = new SqlConnection(connectionString))
{
    using(var cmd = conn.CreateCommand())
    {

    }
}



fxcop
http://archive.msdn.microsoft.com/codeanalysis/Release/ProjectReleases.aspx?ReleaseId=553

gendarme
http://www.mono-project.com/Gendarme

weakreference
http://msdn.microsoft.com/fr-fr/library/system.weakreference%28v=vs.80%29.aspx
0
scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011
29 avril 2011 à 23:02
Merci de ta rapide réponse,

Aufaite je n'utilise pas de connexion SQL c'est juste une simple boucle while qui tourne et dans cette boucle j'apelle une méthode qui remplie la mémoire petit a petit.

Ce que je voudrai faire c'est juste vider la mémoire à la fin de ma boucle while...

PS: J'utilise ce code pour attendre 0.25 seconde entre chaque execution de ma boucle. Je me démandai si il fesait comme le Timer? ou si c'est ca qui m'empeche de vider la mémoire.


System.Threading.Thread.Sleep(250);
Application.DoEvents();
0

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

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 avril 2011 à 23:29
Mets ton code (l'exemple sql peut etre remplacé par des ressources fichier / stream / web service)


Pas de Applications.DoEvents dans un code, c'est pas propre.
Le sleep peut etre correct, mais il est preferable de faire de la programmation parrallele et de l'asynchrone. (j'ai pas trop de recul entre les deux concepts)

parralle = n threads
asynchrone = deleger à un thread un traitement et attendre le retour de son execution comme dans silverlight (appel des webservices)

Avec de la TPL par exemple. si tu est en DOTNET 4.0

Mais sans ton code je ne peux pas trop t'aider.
0
scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011
30 avril 2011 à 00:20
while (blnVerif == false)
{
// Le programme attend 0.25 seconde entre chaque boucle
System.Threading.Thread.Sleep(250);
Application.DoEvents();

// Position 1
if (blnposition1 == false)
{
intNumberPosition1 = ReturnNumber(709, 503);
if (intNumberPosition1 > 0)
{
blnposition1 = true;
lblNumber.Text = Convert.ToString(intNumberPosition1 );
}
}
............
}

Bon en gros, pour faire simple:

Toute les 0.25 seconde, je lance mes tests.
la fonction ReturnNumber retourne un numéro en fonction des coordonnées, et c'est cette fonction qui prend de la place car elle fait une capture d'écran ( pour analyser les pixels ).

Donc ce que j'aimerai faire, c'est que quand j'arrive à la fin de ma boucle while, avant de recommencer à attendre les 0.25 seconde et refaire les tests, j'aimerai tout simplement vider la mémoire.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
30 avril 2011 à 00:34
Comment est fait ta capture d'ecran?

Comment stocke tu le resultat de ta cpature?

Comment travailles-tu sur ta capture d'ecran?

Que fais tu sur le resultat de ta capture?

Le travail sur des images demandes beaucoup de processeur et de mémoire.

regardes les videos de la page
http://www.microsoft.com/france/mstechdays/showcase/sessions.aspx?parcours=TD11_DEV_OUTILS&sf=startDate

Pour avoir des informations?
Mais sur les traitements d'images, il est meme des fois indispensable de travailler en mode c# unsafe, mais il faut explorer les autres possibilités avant?

Bon courage.

Que dis gendarme et fxcop sur les performances.

Regardes avec clrprofiler aussi l'occupation memoire.

Et vire le doevents
0
scalpa29 Messages postés 21 Date d'inscription jeudi 20 novembre 2008 Statut Membre Dernière intervention 13 mai 2011
30 avril 2011 à 00:44
Ma capture d'écran est faite en fonction de la position des pixels, je fais une capture de l'écran de mon ordi, et je recherche la couleur de certaisn pixels en fonction des coodronnées X et Y.

En ce qui concerne le stockage de la capture voici le code:
Bitmap WindowsCapture = CaptureScreen();

Apres, comme je l'ai dis, je travaille dessus en conction des coordonnées donc je peux pas te dire grand chose de plus sur ce sujet.
En ce qui concerne gendarme et fxcop, je n'ai pas encore regarder car j'avais jamais utilisé cela.
0
Rejoignez-nous