IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#] Comment eviter les boucles infinies ?


Sujet :

C#

  1. #1
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut [C#] Comment eviter les boucles infinies ?
    Voila, pour mon apli, je suis obligé de faire en sorte qu'une action se passe tout le temps (en fait, elle lit en permanence le contenu d'un fichier XML).

    J'ai donc fait une boucle infinie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while ( bContinue )
    {
        // on fait l'action
    }
    C'est pas mal mais cela me bloquait mon programme.
    Alors, je l'ai mis ds un thread à part.
    PAs de pb, ca marche bien mais seulement, mon processeur est occupé à 100%

    Comment faire pour éviter cela ou, autre alternative, pour éviter la boucle infinie ?


    Merci de vos conseils/suggestions.

    A+

  2. #2
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Dans ta boucle (dans le thread) fais une temporisation de 100 millisecondes.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 83
    Points : 107
    Points
    107
    Par défaut
    Salut,

    si tu dois surveiller toute modification de ton fichier XML, une solution
    est d'utiliser la classe FileSystemWatcher (qui te permet d'être averti
    quand ton fichier est modifié)

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par abelman
    Dans ta boucle (dans le thread) fais une temporisation de 100 millisecondes.
    Tu veux dire un Sleep(100) :
    Hum.. oui, c'est une solution en effet.

    Merci

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par nostradamus
    Salut,

    si tu dois surveiller toute modification de ton fichier XML, une solution
    est d'utiliser la classe FileSystemWatcher (qui te permet d'être averti
    quand ton fichier est modifié)
    Oui, le pb, c'est que je le fichier peut être modifié à deux endroit et moi, je ne cherche a reperer la modification que sur un seul de ces endroits.

  6. #6
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Je ne vois pas en quoi cela t'empêche d'utiliser FileSystemWatcher : :

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par abelman
    Je ne vois pas en quoi cela t'empêche d'utiliser FileSystemWatcher : :
    Bah, FileSystemWatcher me dira que le fichier a été modifié, mais ne me dira pas où... (à moins que je ne teste si le fichier est modifié, je regarde la modif et en fonction de cette modif, je fais ce que je dois faire.. A voir donc)


    Merci

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Ben pour moi c'est mieux de le faire avec FileSystemWatcher.
    Tu n'es pas obligé de créer de thread pour le faire.
    Et tu n'as pas une boucle qui tourne tout le temps pour vérifier que le fichier a changé.
    Dans la mesure du possible j'evite de créer des threads moi même et je n'utilise que le pool de Thread de .NET.

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Oui, mais dansq mon cas, je ne sais pas si c'est utilisable.
    L'application tourne en permanence et "scanne" un fichier XML en continue :

    le fichier est d ela forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <cat>
    <nom>
    Test
    </nom>
    <etat>
    1
    </etat>
    </cat>
     
    <cat>
    <nom>
    Toto
    </nom>
    <etat>
    0
    </etat>
    </cat>
    Ce que je cherche à faire, c'est répérer si un état à changer (une autre partie de l'aplication se charge de cela, en modificant le contenu du fichier).

    Or, le FileSystemWatcher me dira bien que le fichier a été modifié, mais il ne me dira pas quel etat a été modifié.

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Aujourd'hui comment fais tu pour savoir quel état a changé ?

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    je fais comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    // Boucle infinie
    				while ( bContinue )
    				{
    					// On va de 0 jusqu'au nb total de lignes
    					for ( int i = 0; i < ds.Tables[0].Rows.Count; i++ )
    					{
    						object [] tache = ds.Tables[0].Rows[i].ItemArray;
    						object [] txttache = ds.Tables[1].Rows[i].ItemArray;
     
    						datetache = (string) tache[2];
    						heuretache = (string) tache[3];
     
    						// Si la tâche est pour aujourd'hui
    						if ( Convert.ToDateTime(dtday) == Convert.ToDateTime(datetache) )
    						{
    							// Si le statut de la tache est 0 => tache a faire
    							if ( (string)tache[5] == "0" )
    							{
    								if ( MessageBox.Show("Aujourd'hui, vous avez ceci à faire :\n" + txttache[1], "Tâche à faire", MessageBoxButtons.OK, MessageBoxIcon.Information) == DialogResult.OK )
    								{
    									// Changement de status de la tâche : Non fait(0) => Fait(1)
    									tache[5] = "1";
     
    									ds.AcceptChanges();
     
    									ds.WriteXml(XmlWriter);
    								}
    							}
    						}
     
    					}
    					// pause : après la boucle pour
    					System.Threading.Thread.Sleep(100);
    				}

    mais je suis en train de me demander si c'est le meilleur moyen

  12. #12
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    A mon avis, tu prends le code sans la boucle, tu le mets dans la fonction appellé lors de la notification FileChanged de FileSystemWatcher et ça devrati marcher.

    Je suppose que ds est un DataSet qui est mis à jour ailleurs dans l'appli ...

  13. #13
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par abelman
    A mon avis, tu prends le code sans la boucle, tu le mets dans la fonction appellé lors de la notification FileChanged de FileSystemWatcher et ça devrati marcher.


    Je suis trop bete sur ce coup.....


    Je suppose que ds est un DataSet qui est mis à jour ailleurs dans l'appli ...
    Yep, tu supposes bien



    Merci Abelman

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Optimisation]Eviter les boucles imbriquées
    Par progfou dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 09/03/2007, 17h03
  2. Réponses: 2
    Dernier message: 11/09/2006, 10h49
  3. Comment eviter les doubons dans une requête?
    Par jyms2006 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/03/2006, 14h08
  4. [TP] Lecture de nombres : comment éviter les plantages ?
    Par le-an dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 20/11/2005, 14h54
  5. [FTP] comment corriger une boucle infinie ?
    Par sofybj dans le forum Langage
    Réponses: 8
    Dernier message: 08/11/2005, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo