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

Langage Delphi Discussion :

interrompre une fonction recurcive


Sujet :

Langage Delphi

  1. #1
    DCD
    DCD est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 10
    Points : 4
    Points
    4
    Par défaut interrompre une fonction recurcive
    Bonjour à tous...

    J'ai un soucis avec une fonction récurcive... Je m'en sert pour trouver la taille des dossiers...

    Régulièrement, je fais appel à elle et des fois, elle n'a pas le temps de se terminer, ce qui me produit un bug bien vilain ou un chargement vraiment long... J'aimerai donc savoir s'il existe un moyen de la stopper n'importe quand...

    Le code :

    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
     
     
    function tform1.taille(dos: string):real;
    var
      sr:tsearchrec;
      r:integer;
      s:real;
    begin
     
      dos:=includetrailingbackslash(dos);
      s:=0;
      r:=findfirst((dos+'*.*'),faanyfile,sr);
      while (r=0) or stop do
      begin
        application.processmessages;
        if((sr.attr and fadirectory)<>0) and not stop then
        begin
        if sr.name<>'' then
          if (sr.name<>'.')and(sr.name<>'..') and directoryexists(dos+sr.name) then
            s:=s+taille(dos+sr.name,false);
        end          
        else    
          S:=S+SR.FindData.nFileSizeLow;
        r:=findnext(sr);
      end;
      sysutils.findclose(sr);
      result:=s;
     
    end;
    Merci.

    DeeTOX.

  2. #2
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    une solution simple si ton chargement n'excède pas quelques dizaines de secondes : afficher une fenêtre avec une ProgressBar. j'avais codé un composant qui permettait d'afficher une telle fenêtre : TWaitForm ici
    http://denokan.online.fr/delphi.htm

    si ton chargement est vraiment trop long tu devra peut-être utiliser un thread

    si tu tiens vraiment à interrompre ta fonction récursive (et donc l'empêcher de terminer son action), tu peux toujours utiliser une variable global booléenne, et interroger cette variable avec toute autre action dans ta proc récursive
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  3. #3
    DCD
    DCD est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 10
    Points : 4
    Points
    4
    Par défaut ...
    Merci de ta réponse !

    Bah en fait, le progressbar, 'pas possible : c'est vraiment trop long (et puis il s'agit justement d'aller vite ! lol).

    Pour la variable, j'y ai bien pensé mais ça plante pareil... je m'y prend peut être mal !!!

    Pour le thread, ca me plaierait bien mais j'arrives pas à les utiliser et je n'ai trouvé aucun tutorial qui a sut m'expliquer correctement comment ça marchait !!! snif snif

    DeeTOX.

  4. #4
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    voilà un tuto pour les threads http://lberne.developpez.com/delphi/Proc-Thread/

    par contre si ta fonction provoque un plantage c'est sans doute qu'elle s'appelle un trop grand nombre de fois et qu'elle utilise trop de mémoire... tu devrai peut-être envisager une solution sans récursivité ?
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  5. #5
    DCD
    DCD est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    bah en fait, elle ne plante pas tant que je n'essaie pas de la rappeler !!! Donc l'idée, c'est de l'arrêter puis de la rappeler...

    DeeTOX.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Personellment j'utilise une méthode de ce genre.

    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
     
    function tform1.taille(dos: string):real;
    var
      sr:tsearchrec;
      r:integer;
      s:real;
    begin
      Stop := false;
      fBtnStopTaille.Visible := true;
      dos:=includetrailingbackslash(dos);
      s:=0;
      r:=findfirst((dos+'*.*'),faanyfile,sr);
      while (r=0) or stop do
      begin
        application.processmessages;
        if((sr.attr and fadirectory)<>0) and not stop then
        begin
        if sr.name<>'' then
          if (sr.name<>'.')and(sr.name<>'..') and directoryexists(dos+sr.name) then
            s:=s+taille(dos+sr.name,false);
        end          
        else    
          S:=S+SR.FindData.nFileSizeLow;
        r:=findnext(sr);
        Application.ProcessMessage;
        if FStopTaille := false;
      end;
      sysutils.findclose(sr);
      result:=s;
     
      fBtnStopTaille.Visible := false; 
    end;
    Application.ProcesMessages permet a windows de traiter les messages système (le click d'un boutton par exemple).
    Si le click de fBtnStopTaille change stop, vous pouvez arréter la boucle en cour de traitement.

    Attention Application.ProcesMessages prend du temps machine. pour ne pas trops alonger votre temps de traitement, vous pourriez l'utiliser tous les 10 ou 20 passage dans la boucle.

  7. #7
    DCD
    DCD est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 10
    Points : 4
    Points
    4
    Par défaut nein
    Merci aussi mais ca marche pas : mon bug est toujours présent !

    J'utilise ta soltuon ainsi :

    Ma fonction tourne...

    A un moment, je décide de l'arrêter puis de la relancer : donc :

    Stop := true;
    taille('c:\');

    ca merde une fois sur deux...

    je paniiiiiiique !lol

    deeTOX.

  8. #8
    DCD
    DCD est déconnecté
    Candidat au Club
    Inscrit en
    Juin 2002
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Merci denokan
    Denokan, je te remercie pour ce tutorial d'enfer !!! J'ai réussit à utiliser un thread et c'est le pied j'te jure !!! lol !

    Merci à tous de m'avoir aider.

    DeeTOX.

  9. #9
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    ben moi j'ai fais une bête recherche sur le site, remercie plutot l'auteur Laurent Berne
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

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

Discussions similaires

  1. Interrompre une fonction URL
    Par Ceubex dans le forum Général Java
    Réponses: 4
    Dernier message: 02/01/2011, 12h00
  2. Interrompre une fonction ou une boucle de manière intéractive.
    Par pylearner dans le forum Général Python
    Réponses: 3
    Dernier message: 30/04/2010, 07h53
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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