Pourquoi ce thread ne fonctionne pas ? [Delphi] - Delphi/Pascal - Programmation
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.
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 !
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
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 jai des problèmes avec INDY 10 et TTCPClient(ou un truc du genre) dans un Thread. Jai le message derreur «violation daccès a la mémoire ». Je nai aucun problème avec mon script sans thread
.
Si quelquun pouvait maider ça serai sympa !!!
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
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 !!!
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 :
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