Problemes the thread [Résolu]

Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
- - Dernière réponse : DavKli
Messages postés
30
Date d'inscription
mardi 10 mars 2009
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.
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Messages postés
3869
Date d'inscription
samedi 22 décembre 2007
Dernière intervention
3 juin 2016
3
Merci
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 !

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Bacterius
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
Bonjour,

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

@Bacterius : tu as fais une NDE ?

cantador
Commenter la réponse de cs_cantador
Messages postés
30
Date d'inscription
mardi 10 mars 2009
Dernière intervention
31 octobre 2013
0
Merci
J'ai crée le IdHttp dynamiquement dans le thread, et ca marche sans problème.

Merci a vous.
Commenter la réponse de DavKli

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.