John Dogget
Messages postés384Date d'inscriptionvendredi 18 juin 2004StatutMembreDernière intervention 7 mai 2009
-
13 mai 2006 à 20:28
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 2016
-
19 mai 2006 à 07:14
Salut à tous.
J'utilise une fonction qui récupère l'adresse IP d'un ordinateur à partir d'un site web. Comme cette fonction est dépendante du réseau, sa vitesse d'execution varie et bloque parfois mon appli. D'où l'idée de mettre un thread en place pour permettre à celle-ci de continuer son travail de manière fluide.
C'est une fonction toute bête du genre "function RechercherIP:string;
Le problème, c'est que je sais pas trop comment m'y prendre, le tuto du site m'as paru assez obscure
Comment récupérer le résultat de la fonction à travers le thread ?
Comment mettre celui-ci en place ?
procedure TForm1.FormDestroy(Sender: TObject);
begin
GetIpThread.Free;
end;
procedure TForm1.GetIPThreadThreadTerminate(Sender : TObject);
begin
{ .. renvoyer le resultat ThreadResult la ou il faut .. }
Caption := GetIpThread.ThreadResult;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetIpThread.Resume;
end;
John Dogget
Messages postés384Date d'inscriptionvendredi 18 juin 2004StatutMembreDernière intervention 7 mai 2009 14 mai 2006 à 10:46
Quelques petites questions ...
- une partie de ce code est généré avec l'assistant Delphi ?
- je peux définir ce thread dans une unité à part ou je suis obligé de l'intégrer à une form ?
- la méthode Resume n'est pas defini, c'est normal ?
Ton code est bien, mais ya pas beaucoup d'explications dedans
Merci quand même ...
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 14 mai 2006 à 18:08
Tu peux mettre ton Thread dans une unité à part, et la méthode Resume fait partie integrante de la classe TThread, elle permet de faire démarrer le Thread si celui ci est suspendu ... Ce qui est le cas ici grace à l'argument 'True' dans l'appel du constructeur :
GetIpThread := TMyThread.Create(true);
qui signifie, je crée le Thread mais je le suspend (mis en pause).
type
{ Classe TGetIPThread }
TGetIPThread = class(TThread)
private
{ variable privée pour le retour du thread }
fThreadResult : string;
protected
{ procedure appelée par la procedure Resume du thread }
procedure Execute; override;
public
{ propriété publique qui donne pointe vers le resultat du thread }
property ThreadResult : string read fThreadResult;
end;
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
{ procedure pour gerer l'evenement OnTerminate du thread }
procedure GetIPThreadThreadTerminate(Sender : TObject);
end;
var
Form1: TForm1;
{ une variable pour notre objet thread }
GetIPThread : TGetIPThread;
implementation
{$R *.dfm}
{ methode Execute du thread }
procedure TGetIPThread.Execute;
begin
{ on vide le resultat }
fThreadResult := '';
{ .. ici on mets le traitement .. }
{ on assigne le resultat }
fThreadResult := 'IP';
{ on arrete le thread ce qui appeleras l'evenement OnTerminate }
Self.Terminate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ on crée le thread en mode "pause" ... True }
GetIpThread := TGetIPThread.Create(true);
{ on ne libere pas quand on termine le thread }
GetIpThread.FreeOnTerminate := false;
{ on assigne la procedure de traitement de l'evenement OnTerminate }
GetIpThread.OnTerminate := GetIpThreadThreadTerminate;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{ on arrete le thread et on le libere }
GetIpThread.Terminate;
GetIpThread.Free;
end;
procedure TForm1.GetIPThreadThreadTerminate(Sender : TObject);
begin
{ .. renvoyer le resultat ThreadResult la ou il faut .. }
Caption := GetIpThread.ThreadResult;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
{ on demarre le thread, on peu le placer egalement dans un autre evenement
on verifie qu'il n'est pas deja demarrer ... }
if GetIpThread.Terminated or GetIpThread.Suspended then
GetIpThread.Resume;
end;
end.
Vous n’avez pas trouvé la réponse que vous recherchez ?
John Dogget
Messages postés384Date d'inscriptionvendredi 18 juin 2004StatutMembreDernière intervention 7 mai 2009 18 mai 2006 à 23:35
Je vais essayer d'adapter ça à mon code.
J'ai une autre question :
Mon thread est défini dans une unité à part (pas une form donc), pour le créer, je ne peux pas utiliser l'evenement FormCreate parce qu'il n'existe pas.
- à quel moment puis je créer celui-ci ?
- si je le créer depuis ma form principale, ça va marcher ?
elguevel
Messages postés718Date d'inscriptionjeudi 19 décembre 2002StatutMembreDernière intervention22 novembre 20163 19 mai 2006 à 07:14
Cà ne change rien du tout, ton Thread et ton FormCreate sont toujours dans deux classes séparer.
Il suffira juste dans ton unité qui contient ta Form d'ajouter dans la clause uses l'unité de ton thread, et tu instancie ton thread de la meme façon avec FormCreate.