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 :

Procédure récursive et sortie anticipée, problème ?


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut Procédure récursive et sortie anticipée, problème ?
    Bonjour,

    Voici le code de la procédure récursive :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    // copie du dossier
    		private void CopyDir(string sourceDir, string destDir,int TID)
    		{
    			DirectoryInfo dir = new DirectoryInfo(sourceDir); if (dir.Exists)
    			{
    				try
    				{
    					string realDestDir;
    					if (dir.Root.Name != dir.Name)
    					{
    						realDestDir = Path.Combine(destDir, dir.Name);
    						if (!Directory.Exists(realDestDir))
    							Directory.CreateDirectory(realDestDir);
    					}
    					else realDestDir = destDir;
    					foreach (string d in Directory.GetDirectories(sourceDir))
    					{
    						// if ((new DirectoryInfo(d).Attributes & FileAttributes.System) != FileAttributes.System)
    						if (!Tcontinue[TID]) break;
    						CopyDir(d, realDestDir, TID);
    					}
     
    					if (!Tcontinue[TID]) return; 
    					foreach (string file in Directory.GetFiles(sourceDir))
    					{
    						if (!Tcontinue[TID]) break;
    						string fileNameDest = Path.Combine(realDestDir, Path.GetFileName(file));
    						CopyFile(file, fileNameDest, TID);
    					}
    				}
    				catch
    				{
    					// on stocke l'erreur
    					if (errs[TID].Count < 50)
    						errs[TID].Add(DateTime.Now.ToLongTimeString() + " : [" + appli_saved[TID] + "] Le répertoire \"" + sourceDir + "\" n'est plus accessible.");
    					else
    					{
    						errs[TID].Add(DateTime.Now.ToLongTimeString() + " : [" + appli_saved[TID] + "] 50 erreurs sont apparues, arret de la sauvegarde " + appli_saved[TID]);
    						Tcontinue[TID] = false;
    						return;
    					}
    				}
    			}
    			else
    				errs[TID].Add(DateTime.Now.ToLongTimeString() + " : [" + appli_saved[TID] + "] Le répertoire \"" + sourceDir + "\" est introuvable.");
    		}
    Mon programme copie via plusieurs threads des dossiers volumineux.
    Aussi pour controler l'annulation de chaque thread, j'ai un tableau de boolean (Tcontinue[]) qui normalement devrait me permettre d'annuler en cours de copie un thread. Pour cela je souhaite controler dans la procédure "CopyDir" si la valeur contenue dans Tcontinue est true ou false, si false alors il faut sortir de la procédure et c'est à ce moment là que j'ai le problème, je n'arrive pas à sortir de la procédure, une idée ? Est-ce dû à la récursivité ?

    Ps : TID est l'identifiant du thread en cours.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 326
    Points
    12 326

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Non l'ajout du mot clé "volatile" n'a aucun effet.
    J'ai l'impression que je ne peux pas sortir prématurément de ma boucle "foreach", il relance la procédure pour le dossier suivant.

    Je ne comprends pas.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 184
    Points : 12 326
    Points
    12 326
    Par défaut
    Vous utilisez à de multiples endroits dans la même méthode une expression.
    Sans le mot clé volatile, le compilateur est en droit de factoriser cette formule car rien n'indique qu'il ne peut pas le faire (volatile sert à cela).

    Si l'expression n'est évaluée qu'une fois, vous êtes marron, car les modifications faites par les autres threads seront invisibles.

    Commencez par le volatile et on verra après.

  5. #5
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    J'ai ajouté à la variable "Tcontinue" le mot clé "volatile" :


    Déclaration faite dans le thread principal.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Private volatile bool[] Tcontinue;
    Quand je fais du pas à pas et que je n'exécute qu'un seul thread supplémentaire, le tableau en index 0 contient bien la valeur que je donne.

    Quand je fais mon return dans la méthode "CopyDir" cela me renvoie systématiquement dans mon foreach et ainsi rappelle la méthode.

    Je suis perdu là.

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Mon programme copie via plusieurs threads des dossiers volumineux
    A mon avis c'est de toute facon une mauvaise idée

    Car deux copies simultanées faisant intervenir au moins un disque physique commun a de TRES forte chances d'etre plus lente que deux copies asynchrone

    Donc a mon avis un seul thread gerant les copies est largement sufisant
    Et personnelement.... la récursivité quand il faut il faut (mais c'est rare) si je peux m'en passer je l'evite, c'est souvent plus performant et plus lisible !

  7. #7
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2006
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 256
    Points : 62
    Points
    62
    Par défaut
    Qu'appelles-tu copies asynchrones ?
    Comment puis-je éviter la récursivité pour copier tout le contenu d'un dossier ?

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Qu'appelles-tu copies asynchrones ?
    Oups j'ai voulu dire synchrone !!
    (je melange chaque fois les appellations)

    Tu demare un process quand l'autre est terminé

    Comment puis-je éviter la récursivité pour copier tout le contenu d'un dossier ?
    Une methode recursive est une methode se réappelle elle meme

    On peut généralement remplacer un processus recursif par une boucle et un controle itératif !

    J'admet que le parcours d'un arbre est le terrain privilégié pour une fonction recursive
    Mais personnellement je prefere le traiter en boucle !

    J'avoue aussi ne pas avoir bien lu ton code car quand quand je vois ce type d'indentation j'ai les yeux qui piquent !

Discussions similaires

  1. Procédure de passage en majuscules, problème
    Par thechieuse dans le forum Pascal
    Réponses: 7
    Dernier message: 30/12/2007, 21h06
  2. sortie anticipé d'une procédure
    Par patou41000 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 30/04/2007, 10h09
  3. Redirection sortie standard - Problème encoding
    Par schniouf dans le forum Langage
    Réponses: 4
    Dernier message: 12/12/2006, 13h51
  4. [VB] Organigramme d'une procédure récursive.
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 06/11/2005, 10h53
  5. Procédure Récursives
    Par DocCoinCoin dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 30/10/2002, 19h27

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