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

Signaler
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009
-
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009
-
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

Messages postés
72
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
12 août 2009
2
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.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
39
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 ! -
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009

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 ?
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
39
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 ! -
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009

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 ..
Messages postés
72
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
12 août 2009
2
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.
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009

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
Messages postés
72
Date d'inscription
vendredi 16 mai 2003
Statut
Membre
Dernière intervention
12 août 2009
2
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.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
39
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 ! -
Messages postés
7
Date d'inscription
mardi 2 novembre 2004
Statut
Membre
Dernière intervention
28 juillet 2009

merci pour toutes vos réponses ! très appreciable !