IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Thread & TIdHTTP


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut Thread & TIdHTTP
    Bonjour,

    J'ai récemment créé un thread qui doit aller chercher le code source d'une page, puis l'afficher.

    Hors, lorsque je fais appel à la fonction http.get(monURL), delphi me génère une EaccessViolation. Je ne sais pas d'où ça vient, sachant que la fonction lancée sans le thread fonctionne trés bien.

    Merci à l'avance pour votre aide, n'hésitez pas à me poser des questions si vous souhaitez plus d'infos.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    tu as instancié l'objet http dans le thread ?

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Non, en fait la fonction que j'appelle est dans une autre Unité. Mais j'ai déjà essayer de mettre cette fonction dans le thread, et le résultat est le même

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Pas seulement déplacer la fonction ! Comme dit Shai, créer l'objet TIdHTTP dans le thread.

  5. #5
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    J'ai donc déclaré mon http dans le thread est je l'instancie comme suit dans le constructeur.

    Maintenant il me met une nouvelle erreur, "Erreur de thread : Descripteur non valide (6)".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    constructor ThreadFlux.Create();
    begin
      inherited Create(false);
     
      http:=TIDhttp.Create(nil);
     
      FreeOnTerminate:=true;
      Priority:=tpNormal;
    end;

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Contrôle déjà ça .

  7. #7
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Bonjour à tous !

    J'ai regardé le sujet que tu m'as donné Andnotor, j'ai fait ce qui été écrit, et l'erreur persiste tout de même "Descripteur non valide"

    Une autre idée ?

    Merci

  8. #8
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essai en changeant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    http:=TIDhttp.Create(nil);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    http:=TIDhttp.Create;

  9. #9
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with TThreadFlux.Create do
      try
        WaitFor;
      finally
        Free;
      end;
    Il me met maintenant l'erreur au niveau du WaitFor :/

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 665
    Points : 25 459
    Points
    25 459
    Par défaut
    tu devrais ecrire ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor ThreadFlux.Create();
    begin
      inherited Create(True);
     
      http := TIDhttp.Create();
     
      FreeOnTerminate := True;
      Priority := tpNormal;
     
      Resume();
    end;

  11. #11
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    DONE.

    Il coince toujours sur le "FreeOnTerminate := True;"

  12. #12
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Citation Envoyé par Eithne Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with TThreadFlux.Create do
      try
        WaitFor;
      finally
        Free;
      end;
    Il me met maintenant l'erreur au niveau du WaitFor :/
    Plaisantin .

    C'est exactement le cas cité dans le lien que je t'ai donné ! Supprime FreeOnTerminate si tu veux utiliser WaitFor.
    De plus, FreeOnTerminate est inutile puisqu'il y a un Free dans le bloc try..finally.

    Et un petit extrait de l'aide:

    Avertissement: Quand FreeOnTerminate a la valeur true, la méthode Execute doit exécuter puis libérer le thread avant que votre application puisse exécuter la ligne de code suivante. Donc, vous ne devez appeler aucune méthode de l'objet thread quand FreeOnTerminate a la valeur true sauf si vous créez le thread dans un état suspendu.

  13. #13
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Et c'est bien ce qui j'ai fait. J'ai essayé les deux versions !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      with TThreadFlux.Create do
      try
        WaitFor;
      finally
        Free;
      end;
    -> Bloque au niveau du waitfor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor ThreadFlux.Create();
    begin
      inherited Create(True);
     
      http := TIDhttp.Create();
     
      FreeOnTerminate := True;
      Priority := tpNormal;
     
      Resume();
    end;
    -> Bloque au niveau du FreeOnTerminate :/

  14. #14
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Ces deux exemples fonctionnent sans erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    constructor ThreadFlux.Create;
    begin
      inherited Create(FALSE);
      FreeOnTerminate := TRUE;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ThreadFlux.Create;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    constructor ThreadFlux.Create;
    begin
      inherited Create(FALSE);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ThreadFlux.Create do
      try
        WaitFor;
      finally
        Free;
      end;
    end;
    Le 2ème code est cependant aberrant puisqu'il y a synchronisation avec le thread principal !

  15. #15
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Je vous avoue que je ne comprends pas. ce sont précisément les deux méthodes que j'ai essayé et aucune ne fonctionne...

    Est ce que le "http:=TIDHTTP.create(NIL);" doit être mis ailleurs que dans le constructeur du thread ?

  16. #16
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Où as tu mis la variable Http ?

    Sinon teste ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    constructor ThreadFlux.Create();
    begin
      inherited Create(True);
     
      With TIDhttp.Create do
      try
     
        FreeOnTerminate := True;
        Priority := tpNormal;
     
        Resume();
      finally
        free;
      end; 
    end;

  17. #17
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Personnellement, je fais tout dans Execute.

    Tiens un exemple (basique) de download:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    unit Unit7;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
      IdHTTP;
     
    type
      ThreadFlux = class(TThread)
      private
        FURL  :string;
        FData :string;
      protected
        procedure Execute; override;
      public
        property Data :string read FData;
        property URL :string read FURL;
        constructor Create(aURL :string);
      end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
      public
        procedure DownloadComplete(Sender: TObject);
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { ThreadFlux }
     
    constructor ThreadFlux.Create(aURL :string);
    begin
      inherited Create(FALSE);
      FURL := aURL;
      FreeOnTerminate := TRUE;
    end;
     
    procedure ThreadFlux.Execute;
    begin
      with TIdHttp.Create(nil) do
      try
        HandleRedirects := TRUE;
        FData := Get(FURL);
      finally
        Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ThreadFlux.Create('http://www.developpez.net/forums/') do
        OnTerminate := DownloadComplete;
    end;
     
    procedure TForm1.DownloadComplete(Sender: TObject);
    begin
      Memo1.Text := ThreadFlux(Sender).Data;
    end;
     
    end.

  18. #18
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      with TIdHttp.Create(nil) do
      try
        HandleRedirects := TRUE;
        FData := Get(FURL);
      finally
        Free;
      end;
    Bon, on avance, j'ai plus d'erreur de description vu que maintenant j'ai une erreur de compilation :

    "Source := get(url);" <- il en veut pas (Aucune version surchargée de 'Get' ne peut être appelé avec ces arguments)

  19. #19
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 812
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 812
    Points : 13 527
    Points
    13 527
    Par défaut
    Tu ne peux pas utiliser une variable nommée URL puisque URL est une propriété (d'un autre type) de TIdHttp. Ou alors Self.URL, ou se passer du with, ou etc. etc.

  20. #20
    Nouveau membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    Points : 31
    Points
    31
    Par défaut
    Merci beaucoup

    Me reste juste une chose à régler, pourquoi le "TIdHttp.Create(nil)" initialise toutes mes variables de thread à vide ? ^^

    Je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type ttableau=record
      t:array of string;
    end;
     
    for i:=0 to length(maListe.t)-1 do begin
      with TIdHttp.Create(nil) do
      try
        HandleRedirects := TRUE;
        FData := Get(FURL);
     
        //Traitements sur FDATA
      finally
        Free;
      end;
    End;
    MaListe est de tupe 'TTableau' et quand j'arrive à "with TIdHttp.Create(nil) do", ma liste devient vide.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo