Probleme boucle infinie [Résolu]

Fifoux27 9 Messages postés lundi 8 mars 2010Date d'inscription 3 septembre 2010 Dernière intervention - 25 août 2010 à 10:56 - Dernière réponse : Fifoux27 9 Messages postés lundi 8 mars 2010Date d'inscription 3 septembre 2010 Dernière intervention
- 25 août 2010 à 12:07
Bonjour,

Voila mon probleme est le suivant, mon programme plante parce qu'il reste dans une boucle while a l'infinie mais vue mon code il ne devrait pas faire sa!

while (iNbPhoto != 0)
{
strTempsDebut = dtTempsActuel.ToString("T");
strTempsFin = "0:0:" + iDureePhoto.ToString();

H1 = strTempsDebut.Split(':');
H2 = strTempsFin.Split(':');

TotalHeures = int.Parse(H1[0]) + int.Parse(H2[0]);
TotalMinutes = int.Parse(H1[1]) + int.Parse(H2[1]);
TotalSecondes = int.Parse(H1[2]) + int.Parse(H2[2]);

while (TotalSecondes > 60)
{
TotalMinutes += 1;
TotalSecondes -= 60;
}

while (TotalMinutes > 60)
{
TotalHeures += 1;
TotalMinutes -= 60;
}

strTempsFin = TotalHeures + ":" + TotalMinutes + ":" + TotalSecondes;

while (dtTempsActuel.ToString("T") == strTempsFin)
{
iNbPhoto--;
}

Je precise que le dtTempsActuel est un datetime qui est dans un timer qui reactualise l'heure toute les 100ms.

Aidez-moi s'il vous plait!

Merci

FifouX_x
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 25 août 2010 à 11:42
3
Merci
Salut

Alors j'avoue que j'ai lu rapidement ton code, mais d'abord :
POURQUOI UTILISER DES STRINGS ???

Tu te casses la tête alors que les classes DateTime et TimeSpan sont faites pour faire les calculs sur des dates et des heures. Au final, avec les strings, c'est plus compliqué, tu risques de faire des erreurs, et c'est plus lent. En plus, là tu n'as même pas besoin d'un TimeSpan.

Exemple :
// Presque tout ton code en une seule ligne :
DateTime tempsFin = dtTempsActuel.AddSeconds(iDureePhoto);


Tu pouvais également modifier tes boucles pour transformer le surplus de minutes en heures (avec la méthode ci-dessus, ça ne sert plus à rien, mais je préfère te donner l'astuce) :
TotalHeures += TotalMinutes / 60;
TotalMinutes = TotalMinutes % 60;


Mais surtout, le problème vient de ta dernière boucle. Non seulement je ne la comprends pas vraiment, mais surtout, théoriquement, l'égalité va être vraie pendant en moyenne 500ms. Donc pendant 500ms, il va diminuer iNbPhoto aussi vite que le processeur le lui permettra.
C'est absolument évident qu'il passera en négatif. Donc quand il sortira de la boucle, iNbPhoto ne sera pas égal à 0 (et sera bien plus petit), donc il recommencera la boucle... indéfiniment.

Voici une solution qui t'évitera une boucle infinie (mais je rappelle que je n'ai pas compris l'intérêt/le principe de ta boucle - c'est plutôt là qu'est le problème) :
while(dtTempsActuel.ToString("T") == tempsFin.ToString("T")) 
// Mieux vaut faire une comparaison directement des heures, minutes et secondes, plutôt que de strings
// Genre dtTempsActuel.Hour tempsFin.Hour && dtTempsActuel.Minute tempsFin.Minute && dtTempsActuel.Second == tempsFin.Second
{
    if(iNbPhoto > 0) iNbPhoto--;
}


Mais bon, surtout, explique ce que doit faire ton code exactement, ça nous aidera à t'aider.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de krimog
Fifoux27 9 Messages postés lundi 8 mars 2010Date d'inscription 3 septembre 2010 Dernière intervention - 25 août 2010 à 12:07
0
Merci
Salut Krimog!

Merci pour tes astuces, tu as raison je me suis cassé la tête pour rien pour finir j'ai se que je voulais en 2 ligne ^^

                DateTime tempsFin = dtTempsActuel.AddSeconds(iDureePhoto);

                while (dtTempsActuel.ToString("T") != tempsFin.ToString("T"))
                {
                    
                }


S'est vrai que je n'est pas été très claire avant mais voila mon probleme s'est que tant que dtTempsActuel n'est pas egal a tempsFin je veux qu'il reste dans la boucle a attendre mais le problème est que dtTempsActuel reste toujour a la même heure s'est pour cela que la boucle est infinie pourtant le dtTempsActuel est une variable global et est dans un timer qui tourne toute les 100ms.

        private void tTemps_Tick(object sender, EventArgs e)
        {
            dtTempsActuel = System.DateTime.Now;
            this.Text = "K8055 - " + dtTempsActuel.ToString("T");
        }


Merci pour ta réponse.

FifouX_x
Commenter la réponse de Fifoux27

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.