cs_zmc
Messages postés147Date d'inscriptionvendredi 26 avril 2002StatutMembreDernière intervention26 avril 2008
-
18 mai 2003 à 10:15
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDerniè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...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 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