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
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    Par défaut
    tu as instancié l'objet http dans le thread ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

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

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

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

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    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;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 093
    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;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    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 236
    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;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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 937
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 937
    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
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

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

    Informations forums :
    Inscription : Février 2009
    Messages : 49
    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