TIdHTTP et TThread

cs_zmc Messages postés 147 Date d'inscription vendredi 26 avril 2002 Statut Membre Dernière intervention 26 avril 2008 - 18 mai 2003 à 10:15
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 - 18 mai 2003 à 19:07
Bien le bonjour,
en fait j'ai commencé la création d'un petit gestionnaire de telechargement. Avec le composant TIdHTTP c'est très simple, sauf que j'aimerais afficher la progression par progressBar et par TLabel qui indiquerait le pourcentage efféctué, et en "temps reel" sans bloquer l'application. J'ai donc crée un Thread (TThread) qui contient 2 procedures, une qui "Execute" (donc qui recupere le fichier et le creeé via FileStream) , celle là marche très bien, et une autre qui afficherais les info, et c'est la le probleme, je veux appeler la procedure Form1.IdHTTP1.OnWork (cette proc contient les variables AWorkCount et cie, indispensable pour afficher les infos), seulement je ne sais pas comment l'appeler, j'ai bien sur essayer Form1.IdHTTP1.OnWork, mais ca me sort "pas assez de paramètre originaux", donc si qu'un sait comment faire...

Merci d'avance

zmc, au bord du suicide

3 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 mai 2003 à 12:47
Ton composant TIdFtp est créé dans le thread secondaire, non ?
Dans ce cas, inspire-toi du code suivant :
unit Unit2;

interface

uses
  Classes, ComCtrls, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdFTP;

type
  TFtpThread =  class(TThread)
  private
    FAOwner : TComponent;
    FProgress : TProgressBar;
    FFileName : TFileName;
    FWorkCount : integer;
    FFtp: TIdFtp;
  protected
    constructor Create(AOwner: TComponent; Progress: TProgressBar;  FileName: TFileName);
    procedure Execute; override;
    {Déclaration d'une méthode atant la même signature
     que celle de OnWork du composant TIdFtp}
    procedure FtpProgress(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
    {procédure chargée de l'actualisation de l'affichage dans la fiche}
    procedure AfficheProgress;
  end;

implementation

{ TFtpThread }

procedure TFtpThread.AfficheProgress;
begin
  FProgress.Position : = FWorkCount;
end;

constructor TFtpThread.Create(AOwner: TComponent;Progress: TProgressBar; FileName: TFileName);
begin
  inherited Create(False);
  FAOwner :=  AOwner;
   FProgress := Progress; 
  FFileName : = FileName;
  FFtp :=  TIdFtp.Create(AOwner);
  //===>assigner le nom de la méthode pour recueillir les infos
   FFtp.OnWork := FtpProgress; 
  FreeOnTerminate : = True;
  Resume;
end;

procedure TFtpThread.Execute;
begin
  { mettre ici le code du téléchargement}
   
end;

procedure TFtpThread.FtpProgress(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  FWorkCount := AWorkCount;
  {synchro avec le MainThread de l'appli}
  synchronize(AfficheProgress);
end;

end.


Je ne suis pas rentré dans les détails mais c'est le principe qui est le plus important (en gras ci-dessus).
NB : je n'ai pas testé ce code.
May Delphi be with you
0
cs_zmc Messages postés 147 Date d'inscription vendredi 26 avril 2002 Statut Membre Dernière intervention 26 avril 2008 1
18 mai 2003 à 18:00
Merci, franchement j'y avais pas pensé, je vais essayer au plus vite,
a+
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
18 mai 2003 à 19:07
Ben franchement, si tu penses partager un seul composant FTP par plusieurs threads, tu es mal parti...Où est l'intérêt d'utiliser des threads dans ce cas, si chacun d'eux doit attendre son tour ?
Celà dit, que tu utilises un TIdHttp ou un TIdFtp ne change rien au fond du problème.
May Delphi be with you
0
Rejoignez-nous