Question débutant - Boucle qui ralenti

Résolu
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009 - 27 juil. 2009 à 00:39
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009 - 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 !

10 réponses

Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
27 juil. 2009 à 03:43
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.
3
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 48
27 juil. 2009 à 11:36
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 ! -
1
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009
27 juil. 2009 à 14:32
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 ?
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 48
27 juil. 2009 à 14:51
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 ! -
0

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

Posez votre question
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009
28 juil. 2009 à 02:48
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 ..
0
Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
28 juil. 2009 à 03:19
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.
0
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009
28 juil. 2009 à 03:28
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
0
Minotthor Messages postés 72 Date d'inscription vendredi 16 mai 2003 Statut Membre Dernière intervention 12 août 2009 2
28 juil. 2009 à 04:17
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.
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 48
28 juil. 2009 à 10:02
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 ! -
0
jfleking Messages postés 7 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 28 juillet 2009
28 juil. 2009 à 20:39
merci pour toutes vos réponses ! très appreciable !
0
Rejoignez-nous