Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Problème à la mise en place d'un thread [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (John Dogget)

samedi 13 mai 2006 à 20:28:38 | Problème à la mise en place d'un thread

John Dogget

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 ?

Bref, comment ça fonctionne



dimanche 14 mai 2006 à 07:32:35 | Re : Problème à la mise en place d'un thread

f0xi

Membre Club Administrateur CodeS-SourceS





interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type

  TMyThread = class(TThread)
  private
    fThreadResult : string;
  protected
    procedure Execute; override;
  public
    property ThreadResult : string read fThreadResult;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
    procedure GetIPThreadThreadTerminate(Sender : TObject);
  end;



var
  Form1: TForm1;
  GetIPThread  : TMyThread;

implementation

{$R *.dfm}

procedure TMyThread.Execute;
begin
  fThreadResult := '';
  { .. code traitement .. }
  fThreadResult := 'hello world';
  Self.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetIpThread := TMyThread.Create(true);
  GetIpThread.FreeOnTerminate := false;
  GetIpThread.OnTerminate := GetIpThreadThreadTerminate;
end;

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;

end.


dimanche 14 mai 2006 à 10:46:19 | Re : Problème à la mise en place d'un thread

John Dogget

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 ...

dimanche 14 mai 2006 à 18:08:41 | Re : Problème à la mise en place d'un thread

elguevel

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).

A+ et Bon CoDinG


lundi 15 mai 2006 à 16:34:04 | Re : Problème à la mise en place d'un thread

f0xi

Membre Club Administrateur CodeS-SourceS

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

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.



jeudi 18 mai 2006 à 23:35:45 | Re : Problème à la mise en place d'un thread

John Dogget

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 ?

vendredi 19 mai 2006 à 07:14:37 | Re : Problème à la mise en place d'un thread

elguevel

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.




Cette discussion est classé dans : problème, fonction, site, thread, place


Répondre à ce message

Sujets en rapport avec ce message

Problème avec Canvas.draw [ par fabiin ] salut,voici mon prob:j'utilise un threaddans ce thread dans ce thread je dessine sur un TBitmap(jusque la pas de problème)ensuite, je veu afficher mon Frame et thread [ par stailer ] Salut tout le monde !J'ai un problème avec les threads et j'aurai besoin d'une explication :Si je lance un thread avec une fonction sur une fiche il y Problème création thread [ par VolaiL ] Bonjour, j'ai un petit problème de création de thread.Je souhaiterai lancer le thread lorsqu'on appuie sur enter, mais ca bloque dès la crétion sur "i Problème de fonction déclarée dans Public [ par crostif ] Bonjour,j'ai eu une fonction à déclarer en publique pour y faire appel depuis d'autres formes (les uses sont correctement déclarée)lors de la compilat Problème IdHTTP1.Disconnect [ par architect ] Bonjour, J'ai un problème actuellement avec la fonction IdHTTP1.Disconnect. Mon but étant de pouvoir arrêter un téléchargement en cours de route. Voi Evenements d'un TApplication non géré à cause d'un chargment de DLL... [ par OrsE ] Salut tout le monde, Ceci est la suite de ce post, http://www.delphifr.com/forum.v2.aspx?ID=480490 Je le refait car j'ai pu identifier le problème cet Soit le Thread, soit l'UDP [ par stailer ] Salut tout le monde,J'ai un petit problème avec mon appli en développement :J'utilise un thread dans lequel s'éxecute une connexion à des serveurs par IncHour [ par Eric84 ] Bonjours, J'ai un problème avec la fonction INCHOUR. Code :   if (FichierTransfert.ReadString('Configuration', 'Periode', '') 'NOR') then      IncHou probleme avec la fonction length [ par informatixo ] J'ai réalisé une fonction EstNumerique en m'inspirant d'une solution que delphiprog avait donné dans un post, donc ne vous étonnez pas de ce nom. Je Problème de thread avec un idhttp (indy 10) [ par ACHPI32 ] Hello,J'essaye de faire un petit téléchargeur avec le composant tidhttp. Tout fonctionne sauf... l'interruption en cours de téléchargement. En fait je


Nos sponsors

Sondage...

CalendriCode

Novembre 2008
LMMJVSD
     12
3456789
10111213141516
17181920212223
24252627282930

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.