[Delphi] à propos des threads ...

à propos des threads ... [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 09-03-2005 à 13:39:12    

Bonjour à tous,
 
alors comme prévu voici des questions concernant les threads.
 
Alors pour commencer j'avais fait une form enregistré sur telechargement.pas contenant les diverses routines pour visualiser l'avancemet d'un téléchargement .
voici son code :  
 

Citation :

unit Unittelechargement;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdAntiFreezeBase, IdAntiFreeze, StdCtrls, ComCtrls, XPMan,DateUtils;
 
type
    TFormtelechargement = class(TForm)
    IdHTTP1: TIdHTTP;
    IdAntiFreeze1: TIdAntiFreeze;
    ProgressBartelechargement: TProgressBar;
    Labeltailletelecharge: TLabel;
    XPManifest1: TXPManifest;
    Labelvitesse: TLabel;
    StatusBar1: TStatusBar;
    procedure IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
     nbfichier:integer;
    procedure recupere;
   
  end;
 
var
  Formtelechargement: TFormtelechargement;
  fstartdate:tdate;
const
  RS_Fin = 'Téléchargement terminé';
 
implementation
 
{$R *.dfm}
procedure tformtelechargement.recupere;
begin
 
end;
 
 
 
procedure TFormtelechargement.IdHTTP1Work(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCount: Integer);
var ElapsedTime : Cardinal;
begin
 if AWorkMode = wmRead then
  begin
    ProgressBartelechargement.Position := AWorkCount ;
    LabelTailleTelecharge.Caption := 'Taille : '+inttostr(round(Aworkcount/1000))+' ko / '+inttostr(round(progressbartelechargement.max/1000))+' ko.';
     ElapsedTime := SecondsBetween(Now,FStartDate); //Calculer le temps de téléchargement
     if ElapsedTime>0 then
     begin
       statusbar1.Panels[1].Text:='Vitesse :  '+inttostr(round((AWorkCount/1024)/ElapsedTime))+' Ko/s';
       Formtelechargement.IdAntiFreeze1.process;
     end;
    end;
end;
 
procedure TFormtelechargement.IdHTTP1WorkBegin(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
 if AWorkMode = wmRead then
  begin
    ProgressBartelechargement.Max := AWorkCountMax;
    ProgressBartelechargement.Position := 0 ;
    statusbar1.Panels[1].Text:='Vitesse : 0 ko/s';
    FStartDate := Now;
  end;
end;
 
procedure TFormtelechargement.IdHTTP1WorkEnd(Sender: TObject;
  AWorkMode: TWorkMode);
begin
 if AWorkMode = wmRead then
  begin
    LabelTailleTelecharge.Caption := RS_Fin;
    ProgressBartelechargement.Position := ProgressBartelechargement.Max;
  end;
end;
 
end.


 
Désolé pour la longueur.
 
Voici ce que j'ai trouvé pour les threads :  
 

Citation :

// ajouter ce type en haut
//c kom pour une form, vous pouvez ajouter des procedure ou des fonction dans ce thread kom vous le voulez; TBoucle -> mais vous pouvez mettre ce ke vous voulez
TBoucle = class(TThread)
private
    procedure Affiche();
protected
    procedure Execute();override;
public
    constructor Create();
end;
var //global
    Boucle:TBoucle;
 
//après c simple
//Pour démarrer le thread, il faut appeler create:
Boucle := TBoucle.Create
 
//create obligatoirement ces lignes présentes :
constructor TBoucle.Create;
begin
inherited Create(false);
FreeOnTerminate := True;
//la priorité : par obligatoire
Priority := tpLower;
end;
 
//Pour Execute :
procedure TBoucle.Execute;
begin
// le code ke vous voulez!
//ce code sera effectué sans bloqué le reste du progs, vous pouvez mettre un boucle !
//Si vous devez modifier des infos sur un controle, il faut utiliser un truk intermediaire.
//en gros: faire les modif dans des valeurs, et appelé une fonction ki affiche ces valeurs.
//Mais il faut l'appeler kom ca:
Synchronize(Affiche); //par exemple
end;
 
//Pour terminer le thread: (a mettre dans onclose par exemple)
Boucle.Terminate;


 
Malheureusement comme vous pouvais le lire, l'auteur ne parvient que rarement à faire des phrases compréhensbiles ! :D
 
Ma question est donc :
 
 - un thread doit il se trouver necessairement seul dans un fichier .pas ! Autrement dit, puis-je insérer mon thread dans la fiche telechargement que j'ai déjà ? Car j'ai vu que l'on pouvait faire : nouveau --> objet thread, qui crée automatiquement une fiche thread, mais sur laquelle il n'y a pas de form associée.
 
Merci pour vos réponses.


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 09-03-2005 à 13:39:12   

Reply

Marsh Posté le 09-03-2005 à 13:56:41    

Les Forms et tous les objets visuels tournent dans le thread principal.
À partir du moment où tu crées des threads secondaires, ils ne peuvent pas être liés à une Form vu que cette Form serait gérée par deux threads à la fois.
Un thread dans Delphi c'est juste une classe qui hérite de TThread. Tu peux déclarer ta classe où tu veux, mais vu qu'elle hérite de TThread elle ne peut pas en même temps hériter de TForm, et donc ce n'est pas une Form :D
 
J'ai l'impression que tu mélanges les Forms (=fiche) et les fichiers .pas qui sont les Units (=unités?)
Les Forms sont juste des classes dérivant de TForm.
Une Unit peut contenir plusieurs classes, même si généralement on en met une par Unit (c'est ce que fait Delphi pour les classes générées automatiquement).


Message édité par antp le 09-03-2005 à 13:58:11

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-03-2005 à 15:09:15    

Bon alors effectivement je n'ai pas bien compris ce que tu disais précédemment !
 
Donc pour faire un trhead il faut bien passer pas nouveau-->Objet Thread ?
ou pas ?
 
Ensuite, je suis bloqué : j'ai un idhttp sur ma form principale, mais bie nsur si je me sert de lui dans mon thread, ce dernier bloque qd même .
De plus dans mon thread, aucune librairie n'est chargée, donc plein de commande ne fonctionne nt pas ! du style dans la procedure d etlechargment : except on Eidhtttpprotocoleexception ! et ben delphi ne reconnait plus.
 
Bref je suis vraiment largué.
Je serais très reconnaissant à qui que ce soit de bien vouloir m''expliquer calmement et posement comment fonctionnent ces threads
 
Merci


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Marsh Posté le 09-03-2005 à 15:14:00    

davidmarli a écrit :


Donc pour faire un trhead il faut bien passer pas nouveau-->Objet Thread ?
ou pas ?


 
Pas obligatoirement. Un thread c'est une classé dérivée de TThread. Tu la crées à la main ou avec l'assistant Nouveau->Thread.
 

davidmarli a écrit :


Ensuite, je suis bloqué : j'ai un idhttp sur ma form principale, mais bie nsur si je me sert de lui dans mon thread, ce dernier bloque qd même .


 
C'est que tu t'en sers mal :p Juste après avoir fait le Get dans le thread tu dois faire un Sleep, sinon ça revient exactement au même que ce que t'avais fait sans le thread.
 

davidmarli a écrit :


De plus dans mon thread, aucune librairie n'est chargée, donc plein de commande ne fonctionne nt pas ! du style dans la procedure d etlechargment : except on Eidhtttpprotocoleexception ! et ben delphi ne reconnait plus.


 
Faut rajouter ce qu'il faut dans les "uses" :o
 


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-03-2005 à 15:35:52    

Bon finalement après une enième recherche sous google je suis tombé sur ce document PDF.
 
http://lberne.developpez.com/delph [...] hreads.pdf
 
je le trouve vraiment très pédagogique et vraiment bien fait.
 
J'ai réussi à fair eun petit truc avec.
 
JE vais donc grandement m'en servir pour réecrire mon unit de telechargement !
 
encore merci pour ton aide.
 


---------------
Matheux Fou - https://afficheur-tempo.fr - TEMPO BOX pour abonnés TEMPO EDF
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed