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

VB 6 et antérieur Discussion :

[VB6] Comment gérer un Timeout sur l'api HttpSendRequest


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut [VB6] Gestion Asynchrone des api wininet
    Bonjour,

    Le code ci dessous, permet de lire un flux http d'un fichier se trouvant sur un serveur distant.
    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
    'Create an internet connection
    hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, 0)
    If CBool(hOpen) Then
        'Ouverture du pointeur HTTP
        hConnect = InternetConnect(hOpen, stUrlDeb, INTERNET_DEFAULT_HTTP_PORT, vbNullString, _
                    vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
        If hConnect > 0 Then
            'Préparation de l'ouverture de la page
            hRequest = HttpOpenRequest(hConnect, "GET", stUrlFin, "HTTP/1.0", vbNullString, 0, _
                    INTERNET_FLAG_KEEP_CONNECTION, 0)
            If CBool(hRequest) Then
                'sHeader = "Connection: Keep-Alive" & vbCrLf
                'iRetVal = HttpAddRequestHeaders(hRequest, sHeader, Len(sHeader), HTTP_ADDREQ_FLAG_REPLACE Or HTTP_ADDREQ_FLAG_ADD)
                'Debug.Print iRetVal & " " & sHeader;
                iRetVal = HttpSendRequest(hRequest, vbNullString, 0, vbNullString, 0)
    .....
    Le problème est le suivant :
    Quand le serveur est très lent à répondre (pas quand il est down car sinon un code retour envoyé), l'api HttpSendRequest attend une réponse et reste donc bloquée (parfois plusieurs minutes ...).
    Du coup, mon application se "gèle" ce qui est très génant !

    Y'a-t-il un moyen de gérer un timeout sur cette api ? Ou alors de pouvoir stoper l'exécution de cette api ?

    Merci d'avance pour votre aide.

    ++

  2. #2
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    Bon, j'ai trouvé peut-être une méthode, mais ça parait un peu chaud ...

    En fait, il faut gérer tout ça en asynchrone ...
    On passe le paramètre INTERNET_FLAG_ASYNC en paramètre dans la fonction ci dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, INTERNET_FLAG_ASYNC)
    Ensuite, on procède de la même manière que précédemment, sauf qu'il faut utiliser la fonction HttpSendRequestEx à la place de la fonction HttpSendRequestEx.

    Cette fonction est défini comme suit :
    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
    Public Type INTERNET_BUFFERS
        dwStructSize As Long        ' used for API versioning. Set to sizeof(INTERNET_BUFFERS)
        Next As Long                ' INTERNET_BUFFERS chain of buffers
        lpcszHeader As Long       ' pointer to headers (may be NULL)
        dwHeadersLength As Long     ' length of headers if not NULL
        dwHeadersTotal As Long      ' size of headers if not enough buffer
        lpvBuffer As Long           ' pointer to data buffer (may be NULL)
        dwBufferLength As Long      ' length of data buffer if not NULL
        dwBufferTotal As Long       ' total size of chunk, or content-length if not chunked
        dwOffsetLow As Long         ' used for read-ranges (only used in HttpSendRequest2)
        dwOffsetHigh As Long
    End Type
     
    Public Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" _
        (ByVal hHttpRequest As Long, lpBuffersIn As INTERNET_BUFFERS, ByVal lpBuffersOut As Long, _
        ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    J'ai par contre un peu de mal à voir comment appeler cette api, et la gérer ...

    Merci d'avance pour votre contribution.

  3. #3
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut
    J'ai trouvé ça, mais je pense qu'il doit y avoir des bugs sur les api wininet !
    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
    'Test Asynchrone
    hOpen = InternetOpen(scUserAgent, INTERNET_OPEN_TYPE_PRECONFIG, vbNullString, vbNullString, INTERNET_FLAG_ASYNC)
    If CBool(hOpen) Then
        'Test Asynchrone avec un serveur virtuel qui attends 15 secondes avant de retourner la chaine souhaitée
        stUrlDeb = "127.0.0.1"
        hConnect = InternetConnect(hOpen, stUrlDeb, 8080, vbNullString, _
                    vbNullString, INTERNET_SERVICE_HTTP, 0, 0)
        If hConnect > 0 Then
            'Préparation de l'ouverture de la page
            hRequest = HttpOpenRequest(hConnect, "GET", stUrlFin, "HTTP/1.0", vbNullString, 0, _
                    INTERNET_FLAG_KEEP_CONNECTION, 0)
            If CBool(hRequest) Then
                'Test asynchrone
                PauseTime = 5000    ' Définit la durée de temporisation en ms.
                Start = Timer    ' Définit l'heure de début.
                Do While iRetVal = 0 And EnCours < (Start + PauseTime)
                    iRetVal = HttpSendRequest(hRequest, vbNullString, 0, vbNullString, 0)
                    EnCours = Timer
     
                    'InternetReadFile Open_Requete, tampon, Len(tampon), Nbr_Char
                    'Lecture de la page dans le buffer
                    DoEvents ' Donne le contrôle à d'autres processus.
                Loop
    			.....
    Ca semble pourtant bien fonctionné en mode debug, mais dès que l'on est en exécution normal, j'ai un message de planbtage de VB6 ...

    Une idée ?

    Merci d'avance pour votre aide.

    ++

    EDIT :
    J'ai trouvé ce lien en DotNet ...
    http://www.developer.com/net/csharp/article.php/3436841

  4. #4
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Do While iRetVal = 0 And EnCours < (Start + PauseTime)
    je dirais
    Do While iRetVal = 0 And timer <= (Start + PauseTime)

  5. #5
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Points : 165
    Points
    165
    Par défaut [VB6] Gestion Asynchrone des api wininet
    Ca ne change rien, Visual basic plante sytématiquement !

    J'ai épluché tout le Web pour trouver des infos sur la gestion asynchrone en VB, mais à part le lien suivant (que je n'arrive pas au passage à mettre en oeuvre), il n'y a quasiment rien du tout !

    http://support.microsoft.com/default...%3Bfr%3B189850

    Je pense que cela a du forcément être utilisé par le passé !

    Je continue mes recherches ! D'avance merci pour les personnes qui pourront m'aider dans mes recherches.

    ++

    EDIT :
    Pour les pros en C, voici une méthode ...
    http://www.codeguru.com/Csharp/.NET/...cle.php/c8665/

    EDIT 2 :
    Bon apparemment, le mode asynchrone n'est pas conseillé avec les api wininet sous Visual Basic 6 (ça fonctionne sous VB5 par contre ... bizarre) ...
    Ca doit fonctionné en mode compilé mais pas en debug

Discussions similaires

  1. comment gérer plusieurs locks sur une table?
    Par charluber dans le forum Oracle
    Réponses: 4
    Dernier message: 18/04/2006, 21h28
  2. [VB6] Comment placer 1 logiciel sur un réseau
    Par MegaBigBoss dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/04/2006, 17h29
  3. Réponses: 11
    Dernier message: 06/04/2006, 13h30
  4. [VB6] Comment faire un update sur des textbox qui sont créés
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 27
    Dernier message: 16/02/2006, 14h52
  5. [VB6] Comment accéder a la visionneuse d'API ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 13/11/2002, 12h57

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