Problemes the thread

Résolu
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013 - 8 avril 2011 à 15:29
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 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 :-(

Voici l'appel du thread :
    
try
  LoadWebPage := TLoadWebpageThread.Create(RssFeedList[int1-1].Link);
except
  MainForm.Memo1.Text := '';
end;


Et voici le thread en question :
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.

3 réponses

Bacterius Messages postés 3792 Date d'inscription samedi 22 décembre 2007 Statut Membre Dernière intervention 3 juin 2016 10
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é

Cordialement, Bacterius !
3
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 avril 2011 à 11:01
Bonjour,

Voir aussi le TWebbrower(le Embedded..) qui possède des évènements de stand by..

@Bacterius : tu as fais une NDE ?

cantador
0
DavKli Messages postés 28 Date d'inscription mardi 10 mars 2009 Statut Membre Dernière intervention 31 octobre 2013
11 avril 2011 à 11:54
J'ai crée le IdHttp dynamiquement dans le thread, et ca marche sans problème.

Merci a vous.
0
Rejoignez-nous