Question débutant - Boucle qui ralenti [Résolu]

jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention - 27 juil. 2009 à 00:39 - Dernière réponse : jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention
- 28 juil. 2009 à 20:39
Bonjour tout le monde. Ma question pourrait être simple pour quelque uns d'entre vous mais pour moi c'est un vrai casse tête.

J'ai créer un petit programme avec des condition qui tourne sans cesse. Mon petit programme fonctionne parfaitement mais au bout d'une heure de marche, ont dirait que tout devient très lent ... c'est normal ? Il y a moyen d'éviter cela ?

Car pour le moment mon programme effectu sans arret des boucle fait des actions et refait toujours la même chose ... bref il tourne en rond mais devient lent a la longue ...

bref des solutions ?

Merci !
Afficher la suite 

10 réponses

Répondre au sujet
Minotthor 72 Messages postés vendredi 16 mai 2003Date d'inscription 12 août 2009 Dernière intervention - 27 juil. 2009 à 03:43
+3
Utile
Bonjour,

Nous allons avoir besoin de plus d'informations si vous voulez une réponse à votre question. Il faudra notamment que vous nous expliquiez à quoi sert votre programme pour que nous vous proposions des pistes à suivre pour optimiser son fonctionnement.

Qu'entendez-vous par "des conditions qui tournent sans cesse" ? S'agit-il d'une itération de ce type ?

while (true)
{
if (...)
{...}
if (...)
{...}
}

Cela fait partie des choses à éviter en programmation, d'autant plus si votre programme est destiné à tourner de façon permanente. Il va utiliser toute le temps machine disponible pour exécuter à l'infini sa boucle et tous les autres programmes vont fatalement en être ralentis. Je serais même surpris que les ralentissements n'apparaissent que "au bout d'une heure de marche". Ce que vous décrivez ressemble plutôt à une fuite de ressources.

De façon très générale, je vous conseille de repenser votre programme. Commencez par identifier clairement la situation que votre programme cherche à modifier lorsqu'elle apparaît. Ensuite, cherchez s'il est possible de déclencher votre code uniquement à l'apparition de cette situation, c'est-à-dire de l'extérieur. Si vraiment ce n'est pas possible ou que cela n'en vaut pas la peine comptes tenus de la difficulté ou des intervalles raisonnablement nécessaire entre deux exécutions de la boucle, utilisez un Timer.

Mathieu.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Minotthor
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 27 juil. 2009 à 11:36
+1
Utile
Salut

Bien d'accord avec Minotthor : un programme ne doit pas tourner sans cesse : il faut, autant que possible, le mettre en attente d'un événement, et si ce n'est pas possible, le faire fonctionner sur un timer (100 ms, 1 sec, 5 min, tout dépend de la "réactivité" que le programme doit avoir).

Toujours est-il que si le programme est de plus en plus lent, il me semble que c'est un problème d'utilisation mémoire. Le GC du framework .net va supprimer les objets non référencés, mais si tu gardes des références sur tous les objets, il est évident qu'en tournant en boucle, ton programme va utiliser une quantité de mémoire dingue.
Utilises-tu des listes ? Accroches-tu des événements à chaque boucle ? Tu devrais regarder (grâce au gestionnaire des tâches) la mémoire utilisée par ton programme. Si elle s'accroît de façon permanente, c'est que le problème vient de là.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention - 27 juil. 2009 à 14:32
0
Utile
Ouais je comprend bien mon programme fonctionne avec des Thread.sleep() pour faire attendre le processus ... je devrais augmenter le délais pour régler les problèmes ?
Commenter la réponse de jfleking
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 27 juil. 2009 à 14:51
0
Utile
Thread.Sleep c'est déjà mieux qu'une boucle simple (même si c'est moins bien qu'un timer).
Cependant, ce n'est pas ça qui va faire ralentir ton programme. Regarde la mémoire utilisée, comme je le disais.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention - 28 juil. 2009 à 02:48
0
Utile
Bref je crois savoir quelle est le problèmes. Une partie de mon petit programme vérifie la couleur du pixel sous la sourie. Si la couleur n'est pas la bonne la sourie avance de un pixel et ainsi de suite jusqu'il trouve la bonne couleur. Le tout fonctionne parfaitement mais au bout d'environ 45 minutes cela flanche .... il passe par dessus la bonne couleur et le CPU roule a 100% .... bref je comprend pas trop koi faire ..
Commenter la réponse de jfleking
Minotthor 72 Messages postés vendredi 16 mai 2003Date d'inscription 12 août 2009 Dernière intervention - 28 juil. 2009 à 03:19
0
Utile
Je suppose que votre appel à Thread.Sleep(int) est pratiqué aussitôt après la reconnaissance d'une couleur exacte. Quand il ne trouve pas la couleur exacte le repositionnement de la souris et le test de couleur tourne à l'infini.

Si vous ajouter un Thread.Sleep(int) - éventuellement plus court, selon vos besoins - même si les conditions n'ont pas été rencontrées, cela devrait l'empêcher de saturer le processeur. Mais cela n'améliorera pas le fonctionnement de votre programme. Pour cela il faudrait que vous nous expliquiez à quoi il sert et surtout dans quelles conditions il fonctionne.

Par hasard, ce ne serait pas un programme pour jouer de façon automatique à un jeu en ligne ? Remarquez qu'on n'est plus à ça près ...

Mathieu.
Commenter la réponse de Minotthor
jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention - 28 juil. 2009 à 03:28
0
Utile
lol ouais peut être bien et tout fonctionne tres bien sauf ce petit bug lol .. tu veus dire quoi par Remarquez qu'on n'est plus a ca pres ? :P
Commenter la réponse de jfleking
Minotthor 72 Messages postés vendredi 16 mai 2003Date d'inscription 12 août 2009 Dernière intervention - 28 juil. 2009 à 04:17
0
Utile
Bah, qu'on en voit de toutes les couleurs sur Internet de nos jours. Ce n'est plus ce que c'était, le bon vieux temps tout ça. Quand on était jeunes, on était moins vieux. La terre tournait pas si vite ... *radotte*

Je ne sais pas comment fonctionne ta routine de détection, ni comment bouge ce que tu essayes de détecter. Donc je ne peux guère t'aider sans plus d'informations. D'un autre côté, si tu me donnes plus d'informations on va sortir des conditions du forum.

Mathieu.
Commenter la réponse de Minotthor
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 28 juil. 2009 à 10:02
0
Utile
Juste pour information, je ne sais pas si tu utilises la méthode GetPixel() et SetPixel(), mais celles-ci sont trèèèèèèèèèèèèès lentes. Renseignes-toi sur le code non managé (unsafe) pour le traitement des images.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
jfleking 7 Messages postés mardi 2 novembre 2004Date d'inscription 28 juillet 2009 Dernière intervention - 28 juil. 2009 à 20:39
0
Utile
merci pour toutes vos réponses ! très appreciable !
Commenter la réponse de jfleking

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.