[Delphi] Pourquoi ce thread ne fonctionne pas ?

Pourquoi ce thread ne fonctionne pas ? [Delphi] - Delphi/Pascal - Programmation

Marsh Posté le 13-03-2005 à 18:40:22    

Bonjour à tous,
 
bon j'ai installé les indy version 10 pour delphi 7.
 
Voici mon Thread :  
 

Citation :

unit ThreadDownload;
 
interface
 
uses
  Classes,unittelechargement,IdException,Windows,dialogs;
 
type
  Tdownload = class(TThread)
  private
   FTel:Tform2;
    { Déclarations privées }
   Procedure OnTerminateprocedure(sender:tobject);
  protected
    procedure Execute; override;
    public
    constructor create(suspended:boolean);
  end;
 
implementation
 
constructor Tdownload.create(suspended:boolean);
begin
 Freeonterminate:=true;
 inherited create(suspended);
 Ftel:=Tform2.Create(nil);
 Ftel.Labelnomdefichier.Caption:=nomfic;
 Ftel.labelurl.caption:=url;
 Ftel.Show;
 OnTerminate:=OnTerminateProcedure;
end;
 
Procedure Tdownload.OnTerminateprocedure;
begin
 if Assigned(Ftel) then Ftel.release;
end;
{ Important : les méthodes et propriétés des objets de la VCL peuvent uniquement
  être utilisés dans une méthode appelée en utilisant Synchronize, comme :
 
      Synchronize(UpdateCaption);
 
  où UpdateCaption serait de la forme  
 
    procedure Tdownload.UpdateCaption;
    begin
      Form1.Caption := 'Mis à jour dans un thread';
    end; }
 
{ Tdownload }
 
procedure Tdownload.Execute;
var Fs : TFileStream;
begin
if assigned(ftel) then
begin
  Fs := TFileStream.Create(ftel.Labelnomdefichier.caption,fmCreate); //Nom du fichier local
  with Ftel.IdHTTP1 do
  try
     try
        //URL du fichier à télécharger
        Get(Ftel.LabelURL.caption,Fs);
     except
         On E : EIdException do
         { MessageDlg(Format('Erreur Indy : %s',[E.message]), mtError, [mbOK], 0) }
         begin
          //deletefile(ftele.Labelnomdefichier.caption);
          end;
         {On E : Exception do
           ShowMessage(Format('Erreur inconnue : %s',[E.Message]));
    }end;
  finally
   Fs.Free; //Liberer le flux
 
 
  end;
  { Placez le code du thread ici }
end;
end;
 
end.


 
Mais il y a un pb qd j'appelle le thread.
Ce dernir bloque dans la procedure Tdownload.create à la ligne  
Ftel:=Tformtelechargement.create(nil);
 
Le programme reste bloqué indéfiniment sans dire quoi que ce soit (comme si une boucle infini était lancée !!!)
 
Quelqu'un a une idée ?


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

Marsh Posté le 13-03-2005 à 18:40:22   

Reply

Marsh Posté le 13-03-2005 à 21:27:48    

Tu peux pas directement accéder à la VCL dans un thread.  
Ta création de form et tout là, ça va pas.


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

Marsh Posté le 13-03-2005 à 22:30:55    

ben en fait j'ai desinstallé indy 10 et mis indy 9
La même routine marche nickel !


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

Marsh Posté le 13-03-2005 à 22:40:44    

C'est un coup de bol, sur d'autres machines ou à d'autres moments ça peut foirer.
L'utilisation de la VCL dans un thread est très aléatoire.
J'en ai déjà fait l'expérience ;)


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

Marsh Posté le 22-11-2005 à 12:00:10    

Hello davidmarli,
 
Si j'etais toi, je passerai tous les paramètres(variable) au creat du thread, du style :
 
MonThread := Tdownload.creat(True, EditMonFicher.text, EditUrl.text) ;
MonThread.Resume;
 
Comme ça tu peux viré le Form du Creat.
 
Cela dit moi aussi j’ai des problèmes avec INDY 10 et TTCPClient(ou un truc du genre) dans un Thread. J’ai le message d’erreur «violation d’accès a la mémoire ». Je n’ai aucun problème avec mon script sans thread….
 
Si quelqu’un pouvait m’aider ça serai sympa !!!

Reply

Marsh Posté le 23-11-2005 à 00:27:56    

Vu les détails que tu donnes je vois pas trop comment quelqu'un pourrait t'aider :p


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

Marsh Posté le 23-11-2005 à 13:32:04    

Nan enfaite j'avais juste stoné la création de l'objet TCPclient1 := TTCPclient.creat(nil);
 
... Fo que j'arrete de fumer !!!

Reply

Sujets relatifs:

Leave a Replay

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