Probleme boucle infinie

Résolu
Fifoux27 Messages postés 9 Date d'inscription lundi 8 mars 2010 Statut Membre Dernière intervention 3 septembre 2010 - 25 août 2010 à 10:56
Fifoux27 Messages postés 9 Date d'inscription lundi 8 mars 2010 Statut Membre Dernière intervention 3 septembre 2010 - 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

2 réponses

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
25 août 2010 à 11:42
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é. -
3
Fifoux27 Messages postés 9 Date d'inscription lundi 8 mars 2010 Statut Membre Dernière intervention 3 septembre 2010
25 août 2010 à 12:07
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
0
Rejoignez-nous