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 :

Contrôle d'Url TIdHttp


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Par défaut Contrôle d'Url TIdHttp
    Bonjour a tous , Est bonne années

    Me voila confronté a un petit problème pour contrôler plus de 1 000 000 D’URL avec la fonction ci dessous, Je vous laisse imaginer le temps que sa prend de tout contrôlé .
    Donc je me demander si il existé une autre méthode pour traité le contrôle des URL un peu plus vite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function CheckUrl(Url: String): Boolean;
    var
     CtrlUrl: TIdHTTP;
    begin
      Result := False;
      CtrlUrl := TIdHTTP.Create(nil);
      try
       CtrlUrl.Get(Url);
       Result := True;
      except
        Result := False;
      end;
    FreeAndNil(CtrlUrl);
    end;

    Un grand merci pour votre réponse est votre aide.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    1) ne pas détruire/recréer l'objet à chaque fois ;
    2) utiliser un pool de threads pour paralléliser ;
    3) je ne sais pas si un simple ping suffit, qui irait certainement plus vite ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    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
    Egalement utiliser Head à la place de Get pour ne récupérer que l'entête et non la page complète.
    En multi-thread, le temps total serait fortement divisé puisque l'application passe son temps à attendre une réponse des serveurs
    Essayer aussi de jouer avec un timeout si le serveur n'est pas accessible.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Par défaut Je suis pas un grand spécialiste dans les Threads
    Merci pour votre aide donc j'ai tester se code si dessous mais cela ne change en rien a la vitesse de traitement des URL

    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
    type
      TMyThread = class(TThread)
      protected
        procedure Execute; override;
      end;
     
    var
      Form1: TForm1;
     
      Controle: String;
      ResultCtrl: Boolean;
     
      IdHTTP: TIdHTTP;
     
    implementation
     
    {$R *.dfm}
     
    procedure TMyThread.Execute;
    begin
      ResultCtrl := False;
      if Terminated then Exit;
      try
        IdHTTP.Head(Controle);
        ResultCtrl := True;
      except
        ResultCtrl := False;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
      LThread: TMyThread;
    begin
      LThread := TMyThread.Create(True);
      IdHTTP := TIdHTTP.Create(nil);
     
      for I := 0 to Memo1.Lines.Count - 1 do
       begin
         Controle := Memo1.Lines.Strings[I];
         LThread.Execute;
         if ResultCtrl = False then
         begin
           Showmessage('Error :' + Memo1.Lines.Strings[I]);
         end;
       end;
       LThread.Free;
       IdHTTP.Free;
    end;

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 937
    Billets dans le blog
    6
    Par défaut
    Il est question de paralléliser le travail des threads et non de sérialiser les traitements dans un thread pour gagner du temps.

    Il faut donc créer plusieurs threads (optimum = ?) et avoir une gestion de type queue pour relancer un nouveau test à chaque fois qu'un thread est libre.

    ShaiLeTroll a souvent évoqué ce type de choses, avec du code pour l'illustrer.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  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
    Tu n'utilises pas de thread là. Tu en crées un à l'état suspendu, ne le démarre jamais et appelles simplement une de ses méthodes depuis la tâche principale
    Execute ne doit pas être appelé directement, c'est le thread Windows (encapsulé dans TThread) qui s'en charge.

    Et comme le dit tourlourou, il en faut plusieurs pour constater une amélioration, 10 voire plus.
    J'avais fait un petit tuto sur l'accélération du téléchargement. C'est un peu compliqué pour ce que tu veux faire mais le principe général est le même.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations forums :
    Inscription : Juin 2012
    Messages : 142
    Par défaut Essayer aussi de jouer avec un timeout si le serveur n'est pas accessible.
    Oui cela est intéressent , ReadTimeout mais quel est la valeur minimum que je pourrai maitre (100) Trop juste (1500) Trop long mais avec un résultat 100% OK.

    Combien de temps il faut pour savoir si URL est valide ou pas ? Merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/08/2009, 12h19
  2. Récuparation de l URL de IE
    Par Al_co dans le forum Langage
    Réponses: 4
    Dernier message: 24/04/2008, 08h39
  3. [web] tester la validiter d'une URL
    Par zebiloute dans le forum Web
    Réponses: 4
    Dernier message: 25/11/2002, 16h51
  4. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49
  5. [Kylix] Contrôle DBGrid
    Par KThrax dans le forum EDI
    Réponses: 1
    Dernier message: 10/05/2002, 14h18

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