DavKli
Messages postés28Date d'inscriptionmardi 10 mars 2009StatutMembreDernière intervention31 octobre 2013
-
8 avril 2011 à 15:29
DavKli
Messages postés28Date d'inscriptionmardi 10 mars 2009StatutMembreDernière intervention31 octobre 2013
-
11 avril 2011 à 11:54
Bonjour,
je n'ai jamais travaillé avec plus d'un thread, alors il est temps de ce lancer. J'ai une application qui utilise un IdHttp Composant pour charger le source d'un page web. Ce un procedure qui dure et pendant cette temps l'application ne repond pas. Je voulais utiliser un Thread pour resoudre ce probleme mais ca ne marche pas :-(
unit MonThread;
interface
uses
Classes, Graphics, SysUtils, StdCtrls;
type
TLoadWebpageThread = class(TThread)
private
{ Déclarations privées }
MyWebPage: String;
protected
procedure Execute; override;
procedure LoadPage;
public
constructor Create (WebPage: String);
end;
implementation
uses MainUnit;
constructor TLoadWebpageThread.Create (WebPage: String);
begin
inherited Create(False); // False pour lancer l'éxécution
MyWebPage := WebPage;
end;
procedure TLoadWebpageThread.Execute;
begin
{ Placez le code du thread ici }
Randomize;
Synchronize (LoadPage);
Terminate;
end;
procedure TLoadWebpageThread.LoadPage;
begin
MainForm.Memo1.Text := MainForm.IdHTTP1.Get(MyWebPage);
end;
end.
Le Memo1 est bien chargé avec le code source de la page, mais le program ne repond toujours pas pour un certaine temps, comme si j'utilisera pas de Thread.
Merci pour votre aide.
A voir également:
Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire
Bacterius
Messages postés3792Date d'inscriptionsamedi 22 décembre 2007StatutMembreDernière intervention 3 juin 201610 9 avril 2011 à 06:15
Salut,
c'est parce que justement, le Sychronize cause la méthode LoadPage à être exécutée dans le thread principal (celui de l'application). Donc en fait, tout ce que ton second thread fait c'est appeller Randomize ...
Voici comment j'aurai fait:
1. j'aurai enlevé le composant IDHTTP1 du mainform, c'est gênant. Je l'aurai mis dans le thread à la place, et je l'aurai créé et libéré en même temps que le thread (en surchargant le Create et le Destroy)
2. j'aurai créé une propriété Code de type String dans le thread
3. j'aurai appelé IDHTTP.Get dans l'Execute du thread, sans utiliser Synchronize
4. une fois cet appel terminé, j'aurai envoyé un message à MainForm en utilisant SendMessage, et le thread principal le reçoit, et affiche le code source de la page.
Il est nécessaire de passer par les messages car il est interdit d'appeller la VCL depuis un thread externe. Mais rassures-toi c'est assez simple. En plus tu peux rajouter des messages pour par exemple indiquer au thread principal où l'opération en est, en utilisant l'événement OnWork (je crois, de mémoire) du IDHTTP au sein du thread et en envoyant des messages de temps en temps.
Si tu as besoin d'aide n'hésites pas.
PS : tu remarqueras que si tu enleve simplement Synchronize, il est possible que ça marche, mais le code n'est pas bon et si tu continues dans cette voie tu rencontreras des erreurs aléatoires et ça deviendra un enfer - fais-moi confiance, j'y suis été