Problemes the thread [Résolu]

DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 8 avril 2011 à 15:29 - Dernière réponse : DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention
- 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
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 9 avril 2011 à 06:15
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 !

Merci Bacterius 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de Bacterius
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 11 avril 2011 à 11:01
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
DavKli 30 Messages postés mardi 10 mars 2009Date d'inscription 31 octobre 2013 Dernière intervention - 11 avril 2011 à 11:54
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.