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

Composants VCL Delphi Discussion :

Comment gérer une Progressbar pendant un CopyFrom ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut Comment gérer une Progressbar pendant un CopyFrom ?
    hello,

    j'ai fait une ptite procédure permettant de concaténer des fichiers. Je donne donc comme paramètres à cette procédure le nom du fichier à sauver, les noms des fichiers à concaténer, et le nombre de fichier.

    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
    Procedure ConCatFiles(targetname: String; Sourcenames: Array of String; NbreFichiers: integer);
     Var i: Integer; target, source: TFileStream; 
     Begin
      target := TFileStream.Create(targetname,fmCreate );
      try
       i:=0;
       stop:=false;
       Repeat
        source := TFileStream.Create(Sourcenames[i],fmOpenread or fmShareDenyNone);
        ProjetVprintPersoft.ProgressBar.Position := Round((i / NbreFichiers) * 100);
        Application.ProcessMessages; //raffraichissement de la fenêtre
        try
         target.Copyfrom(source,0);
        finally
         source.free;
        end;
        i:=i+1;
       Until (i=NbreFichiers) or stop;
      finally
       target.Free;
       if stop
        then Begin
              deleteFile(targetname);
             end
        else Begin
              ProjetVprintPersoft.ProgressBar.Position := 100;
             end;
      end;
     End;
    Le défilement des la progressbar n'est pas continu, en effet, elle évolue seulement en fonction du nombre de fichier et du fichier en cours de copie. si j'ai 4 fichiers, lorsque le premier est copié, la ProgressBar passe à 25%. Mais ça peut durer un petit temps durant lequel elle n'évolu pas = le temps que met la function target.Copyfrom(source,0).

    Ce que j'aurai voulu savoir c'est s'il est possible de décomposer cette function pour savoir à quel niveau on en est ??

    est-ce assez clair?
    merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Non, y a pas moyen.

    Fait ta copie par petits morceaux et non d'un seul morceau. (Moins rapide seulement)

  3. #3
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui pas d'autres moyens.
    Utilise Read/Write pour copier blocs par blocs.

    Sinon je ne sais pas ce que ca vaut, mais tu peut essayer de creer un thread qui analyse periodiquement le size de ton stream de dest et en soustrayant la taille avant copie tu connait le nombre d'octer copié pour le fichier courrant.

    Apres ya plus qu'a esperer que CopyFrom met a jour position au fure et a mesure de la copie ....

    Sinon coté performance, le fait de passer par une progress bar, entraine un ralentissement notable des performances. le rafraichissement graphique a un cout qui a mon avis est suffisant pour que la perte de perf entre copyfrom et une combinaison de Read/Write soit negligeable mais ca reste a tester.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    j'ai en effet testé le BlockRead/BlockWrite, mais c'est 4 fois plus lent...
    donc j'abandonne l'idée de raffraichir ma ProgressBar!

    merci,
    à+,

    greg

  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    c'est 4 fois plus lent...
    Ca depends de la taille de ton buffer d'ecriture .....
    Plus la taille est grande moins tu as d'acces en ecriture ... et plus tu gagne du temps.

    Essaye en augmentant ton buffer d'ecriture.

    Ou alors essaye en n'appelant pas la methode "Application.processmessage" trop souvent.
    PAr exemple appelle la a chaque fois que le nombre d'octets ecrit depuis le dernier rafraichissement correspont a environs 1/10e de la taille totale du fichier.

    Comme precise plus haut, c'est surtout le refresh graphique qui prend du temps .....

    Pour tester ce que je dit .. tu peux deja le lancer une fois sur 2 ou une fois sur 3 .. et la difference entre avec ou sans CopyFrom sera deja plus petite.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 118
    Points : 57
    Points
    57
    Par défaut
    ok merci bien, je vais regarder ça...

  7. #7
    Membre éprouvé
    Avatar de octal
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    441
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 441
    Points : 957
    Points
    957
    Par défaut
    tu pourrais utiliser idrectement les fonction du shell de Windows shFileOp qui permettent d'afficher la progress bas std.
    http://www.pocketmt.com GLCD Font Creator home site.

  8. #8
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    shFileOp permet la concatenation de fichiers ? il me semblais que cela ne gerais que la copie simple de fichiers d'un erp a un autre ....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

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

Discussions similaires

  1. Gérer une progressBar pendant le traitement
    Par lilou77 dans le forum BIRT
    Réponses: 1
    Dernier message: 01/02/2007, 12h04
  2. [CF][PPC/VB.NET/Datagrid] Comment gérer une colonne CheckBox ?
    Par joefou dans le forum Windows Mobile
    Réponses: 5
    Dernier message: 28/08/2006, 17h08
  3. [VB.NET] Comment gérer une DLL Delphi ?
    Par slimjoe dans le forum VB.NET
    Réponses: 2
    Dernier message: 09/01/2006, 00h10
  4. Site web : Comment gérer une version Officiel et Officieuse
    Par AlphaYoDa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 05/12/2005, 08h48
  5. comment programmer une progressbar
    Par Choucas dans le forum Paradox
    Réponses: 3
    Dernier message: 13/11/2002, 11h07

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