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

Delphi Discussion :

[ICS HTTPCli] Implémenter un TimeOut dans mon appli


Sujet :

Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut [ICS HTTPCli] Implémenter un TimeOut dans mon appli
    Bonjour à tous,

    Est-ce que quelqu'un peut m'aider à implémenter un timeout dans mon appli,
    plus précisement me dire :
    - Qu'est-ce qu'il faut que j'ajoute ?
    - Comment gérer ensuite le TimeOut ?

    car je dois le faire dans une appli déjà existante, qui utilise des Threads
    et qui crée dynamiquement les HTTP

    Voici les bouts de codes que je peux publier, est-ce que cela vous suffit
    pour me dire comment ajouter à chaque Http créée un timout dynamique,
    c'est à dire qu'il se crée pour chaque TMyHTTP.

    Merci à tous pour votre aide

    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
    // Initialisation
    procedure TCHild.InitHttpList(MAX_THREAD : Integer);
    var
      i : integer;
      Http : TMyHttp;
    Begin
          FHttpList.Clear;
          for i:=0 to MAX_THREAD-1 do
          begin
            Http:=TMyHttp.Create(Self);
            Http.Proxy                      :=Main.ProxyHostName;
            Http.ProxyPort               :=Main.ProxyPort;
            Http.ProxyUsername      :=Main.ProxyUserName;
            Http.ProxyPassword      :=Main.ProxyPassword;
            Http.Username               :=FSearch.UserAccount;
            Http.Password               :=FSearch.UserPassword;
     
            Http.OnRequestDone      :=HttpRequestDone;
            Http.OnDocData             :=HttpDocData;
            Http.OnLocationChange   :=HttpLocationChange;
     
            FHttpList.Add(Http)
          end;
    End;
    Dans un autre fichier j'ai :

    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
    unit MyHttp_U;
     
    interface
     
    uses
      Classes, HttpProt, windows;
     
    const
      // Nombre maximum de changement d'url par le champs LOCATION
      // (Si infini mettre un nombre inferieur a 0)
      DEFAULT_RELOCATION = 3;
     
    type
      TMyHttp = class(THttpCli)
      private { Déclarations privées }
        FTrace: TStringList;
        FData: TObject;
        FRelocation: Integer;
        FOnLocationChange: TNotifyEvent;
        procedure DoLocationChange(Sender: TObject);
      protected { Déclarations protégées }
        property FollowRelocation;
      public { Déclarations publiques }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      published { Déclarations publiées }
        property Relocation: Integer read FRelocation write FRelocation default
    DEFAULT_RELOCATION;
     
        property OnLocationChange: TNotifyEvent read FOnLocationChange write
    FOnLocationChange;
     
        property Trace: TStringList read FTrace;
        property Data: TObject read FData write FData;
      end;
     
    implementation
     
    { TMyHttp }
     
    constructor TMyHttp.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FollowRelocation:=False;
      FRelocation:=DEFAULT_RELOCATION;
      FTrace:=TStringList.Create;
      inherited OnLocationChange:=DoLocationChange;
    end; {* cons .Create *}
     
    destructor TMyHttp.Destroy;
    begin
      FTrace.Free;
      inherited Destroy;
    end; {* dest .Destroy *}
     
    procedure TMyHttp.DoLocationChange(Sender: TObject);
    begin
      FTrace.Add(inherited Location);
      if (Relocation=0) or (Relocation>0) and (Trace.Count>Relocation) then
        Abort;
      if Assigned(FOnLocationChange) then
        FOnLocationChange(Sender);
    end; {* proc .DoLocationChange *}
     
    end.

  2. #2
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!

    J'utilise également THttpCli et mon TimeOut se déclenche que si il n'y a pas eu de données receptionnées depuis un certain temps. C'est-à-dire que ce TimeOut est remis à zéro lorsque des nouvelles données sont reçues. Il s'agit plus d'un TimeOut d'inactivité ce qui me semble plus logique pour un TimeOut.

    Je l'ai implémenté dans ce projet :
    • J'utilise l'événement OnDocData pour réinitialiser le TimeOut (reception des nouvelles données)
    • et l'événement OnRequestDone pour savoir que la requête est terminé et stopper la boucle d'attente.
    Attention à utiliser les fonctions asynchrone comme PostAsync par exemple.

    Voici le code que j'utilise pour obtenir une barre de progression sur ce TimeOut :
    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
    Uses mmSytem...;
     
    Var StartTime: Integer;
        MaxTimeOut: Integer;
        CurTimeOut: Integer;
        Completed: Boolean;  
     
    {----------------------------------------------------------------}
    { RECEPTION DE DONNEES                                           }
    {----------------------------------------------------------------}
    Procedure THttpPost.DocDataProc(Sender: TObject; Buffer: Pointer; Len: Integer);
    Begin
      If (Len <= 0) Then Exit;
      StartTime := TimeGetTime;
    End;
     
     
    {----------------------------------------------------------------}
    { RECEPTION TERMINEE -> ANALYSE DU RESULTAT                      }
    {----------------------------------------------------------------}
    Procedure THttpPost.RequestDoneProc(Sender: TObject; RqType: THttpRequest; ErrCode: Word);
    Begin
      Completed := True;
    End;
     
    {----------------------------------------------------------------}
    { POSTER LA REQUETE                                              }
    {----------------------------------------------------------------}
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      Completed := False;
     
      // TimeOut de 10 secondes
      MaxTimeOut := 10000; 
     
      // Au départ de la requête http...
      StartTime := TimeGetTime;
     
      // Exemple d'une requête asynchrone
      PostAsync;
     
      // Boucle d'attente, détection du TimeOut
      Gauge1.MaxValue := MaxTimeOut;
      Repeat
        CurTimeOut := Integer(TimeGetTime) - StartTime;
        Gauge1.Progress := CurTimeOut;
        Application.ProcessMessages;
        Sleep(50);
      Until (Completed) Or (CurTimeOut >= MaxTimeOut);
      If (Completed = False) Then ShowMessage('TimeOut !!');
      Gauge1.Progress := 0;
    End;
    De retour parmis vous après 10 ans!!

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Salut SubO,

    j'analyse tout cela et j'essaie de l'implémenter dans mon programme.

    Merci bcp, je te tiens au courant !

    Amicalement,
    Bruno

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    ok, je suis dispo jusqu'à la fin de la semaine après, je pars 15 jours en vacances !

    De retour parmis vous après 10 ans!!

Discussions similaires

  1. Mes requêtes bloquent dans mon applie.
    Par Eric94 dans le forum Paradox
    Réponses: 1
    Dernier message: 05/11/2007, 17h57
  2. Importer data HTML dans mon appli ?
    Par omarter dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/05/2007, 13h16
  3. Réponses: 2
    Dernier message: 04/10/2006, 13h52
  4. [Framework] que des SELECT dans mon appli Web.
    Par ohyes_ dans le forum JDBC
    Réponses: 16
    Dernier message: 03/08/2006, 19h25
  5. Réponses: 3
    Dernier message: 03/04/2006, 18h30

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