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 :

Ralentissement avec un TProgressBar


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut Ralentissement avec un TProgressBar
    Bonjour,

    Afin de voir l'avancée d'un traitement, j'ai ajouté un tprogressbar.

    Mon traitement consiste à lire un fichier texte avec readln et d'en écrir un autre avec writeln.

    J'ai ajouté dans ma boucle un processmessage mais je passe de 11 secondes à 99 secondes soit 9 fois plus.

    avez-vous une idée.

    Laurent

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Un ProcessMessages n'est pas forcément nécessaire avec le ProgressBar.
    Comment fais-tu progresser ta barre ? Un petit extrait de code.

    @+ Claudius

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ProgressBar_Traitement.Max:=Total_Ligne;
        Label_Info.caption:='Traitement en cours...';
     
        while not Eof(fichier_In) do
        begin
          ReadLn(fichier_In,Ligne);
          WriteLn(fichier_Out,Ligne)
     
          Inc(Position_Ligne);
          ProgressBar_Traitement.Position:=Position_Ligne;
        end;
    Il faut savoir que total_ligne= souvent 5 203 546

    donc le problème est certainement là

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
      ProgressBar_Traitement.Max:=Total_Ligne;
      ProgressBar_Traitement.Step := 1;
      Label_Info.caption:='Traitement en cours...';
     
      while not Eof(fichier_In) do
      begin
        ReadLn(fichier_In,Ligne);
        WriteLn(fichier_Out,Ligne)
        ProgressBar_Traitement.StepIt;
      end;
    Essaye comme ceci. Cela dit je ne vois pas de ProcessMessages dans ton code !

    @+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Je viens de le retirer puisque cela semble ne rien changer.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Sinon ProgressBar_Traitement.StepIt ne change rien.

    a mon avis c'est la valeur de 5 millions qui le gêne.

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par bremer Voir le message
    a mon avis c'est la valeur de 5 millions qui le gêne.
    Tu peux ne faire progresser ta barre que toutes les 1000 Lignes par exemple pour limiter le ralentissement.

    Autre question, tu ne fais pas d'autres traitements entre le ReadLn et le WriteLn ? Parce que là cela ressemble à une copie de fichier.

    @+

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 144
    Points : 47
    Points
    47
    Par défaut
    Je viens de diviser par 1000 l'incrémentation est c'est mieux.

    sinon c'est une copie de fichier avec suppression de certaines lignes par critère mais le code est court.

    Merci

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    1000 lignes était un exemple, tu peux encore diminuer la fréquence de progression de ta barre.
    Mais de toute façon l'ajout d'une ProgressBar ralentira toujours la vitesse d'exécution de ta boucle.

    @+ Claudius.

  10. #10
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    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
     
    const LBuf=$1000;
    var
       i,lu:integer;
       buf:array[1..LBuf] of byte;
    begin
         i:=Total_Ligne;
         ProgressBar_Traitement.Max:=i div lbuf;
     
      ProgressBar_Traitement.min := 0;
      Label_Info.caption:='Traitement en cours...';
    if not fillexiste(monfichier1) then
      begin
       showmessage('Fichier n''existe pas');
       exit;
    end;
    assignfile(f_in,'monfcihier1');
    reset(f_in,1); 
      assignfile(f_out,'monfichier2');
    rewrite(f_out,1);
      i:=0;
      repeat
        BlockRead(f_In,buf,lbuf,lu);
        BlockWrite(f_out,buf,lu,lu);
        inc(i);
        ProgressBar_Traitement.position:=i;
      until lu<lbuf;
    ou passé par l'API de windows copyfile, c'est plus facille
    The CopyFile function copies an existing file to a new file.
    BOOL CopyFile(
    LPCTSTR lpExistingFileName, // pointer to name of an existing file
    LPCTSTR lpNewFileName, // pointer to filename to copy to
    BOOL bFailIfExists // flag for operation if file exists
    );
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/11/2008, 14h50
  2. Ralentissement avec setComposite
    Par execrator dans le forum 2D
    Réponses: 3
    Dernier message: 25/03/2008, 01h10
  3. probleme ralentissement avec avi
    Par gege0202 dans le forum Windows Vista
    Réponses: 4
    Dernier message: 08/05/2007, 18h57
  4. Problème avec la TProgressBar
    Par emirej dans le forum Delphi
    Réponses: 4
    Dernier message: 24/04/2007, 23h03
  5. Ralentissements avec "require" ou "include" ?
    Par damjal dans le forum Langage
    Réponses: 4
    Dernier message: 14/12/2006, 22h04

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