HTTPProgress et bindevent ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

HTTPProgress et bindevent ?

Message par Ar-S »

Salut,

Y'a t il moyen de récupérer un fichier via http (pas ftp) sans freezer le fenêtre via un bindevent ?
Je ne voudrais pas avoir à créer un Thread. Pensez vous que ce soit faisable ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: HTTPProgress et bindevent ?

Message par Marc56 »

D'après la doc, HTTPProgress() est conçu pour renvoyer la progression du téléchargement http s'il est en mode asynchrone.
Donc le programme principal ne devrait pas freezer ? Pas besoin de créer un thread.

Voir la différence avec l'exemple dans la doc, avec ou sans le paramètre #PB_HTTP_Asynchronous

Code : Tout sélectionner

...
Telechargement = ReceiveHTTPMemory("http://www.purebasic.com/download/OgreAssimpConverter.zip", #PB_HTTP_Asynchronous)
...
:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HTTPProgress et bindevent ?

Message par Ar-S »

Oui j'ai vu mais je n'ai pas trouver ou placer ma proce de telech dans la boucle principale, d'ailleurs #PB_HTTP_Asynchronous passe aussi avec ReceiveHTTPFile.
Je fatigue. Aujourd'hui j'ai plus de cerveau, 2h20 de dentiste; ça m'a flingué
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: HTTPProgress et bindevent ?

Message par falsam »

Code : Tout sélectionner

Declare Download()

Global Download

InitNetwork()
OpenWindow(0, 0, 0, 500, 500, "Test HTTPProgress", #PB_Window_SystemMenu)
StringGadget(0, 20, 20, 200, 22, "")

Download = ReceiveHTTPFile("http://www.purebasic.com/download/OgreAssimpConverter.zip", "OgreAssimpConverter.zip", #PB_HTTP_Asynchronous)

If Download 
  AddWindowTimer(0, 1, 10)
  BindEvent(#PB_Event_Timer, @Download())
EndIf

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Procedure Download()
  Progress = HTTPProgress(Download)
  
  Select Progress
    Case #PB_Http_Success
      SetGadgetText(0, "Download finished")
      UnbindEvent(#PB_Event_Timer, @Download())
      
    Case #PB_Http_Failed
      SetGadgetText(0, "Download failed")
      UnbindEvent(#PB_Event_Timer, @Download())
      
    Case #PB_Http_Aborted
      SetGadgetText(0, "Download aborted")
      UnbindEvent(#PB_Event_Timer, @Download())
      
    Default
      SetGadgetText(0, "Current download: " + Progress)
      
  EndSelect
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HTTPProgress et bindevent ?

Message par Ar-S »

Ok merci !
En fait mon timer ne sert à rien ! oO
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: HTTPProgress et bindevent ?

Message par Marc56 »

@falsam: Joli! :P
Technique simple et efficace pour ne pas faire trop de pooling sur l'état de la progression :idea:
(Je met ça de côté: penser à utiliser un Timer. Merci) :wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: HTTPProgress et bindevent ?

Message par Ar-S »

@Marc56, le timer était pour mon projet mais au final il ne (me) sert à rien.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: HTTPProgress et bindevent ?

Message par Marc56 »

Ar-S a écrit :@Marc56, le timer était pour mon projet mais au final il ne (me) sert à rien.
Tel que je le vois, dans l'exemple de falsam, il permet de restreindre l'interrogation de l'état du téléchargement à une fois par seconde et évite ainsi de saturer une tâche (de fond).
Le chargement allant en général plus vite que l'affichage, inutile d'interroger en permanence.
(ou alors j'ai mal compris l'idée ?) :|
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: ~ STREAM RADIO ~ v 1.07.4

Message par Marc56 »

Je me pose une question: ReceiveHTTPMemory() est il doté d'un timeout par défaut ?

Je commence aussi à (essayer de) mettre au point un système de vérification de version.

J'ai créé ceci:
Note : C'est du PB 5.50 B1. pour les versions anciennes, remplacez les 3 #PB_MessageRequester_xxx par 64, 48 et 16

Code : Tout sélectionner

EnableExplicit

InitNetwork()

Define Actual_Version$ = "2016.06.16 09:20" ; Valeur de test
Define Server_Version$ = ""

Define *Buffer = ReceiveHTTPMemory("http://metoo.free.fr/ACME_Desk_version.txt") ; , #PB_HTTP_Asynchronous)

If *Buffer
    Server_Version$ = PeekS(*Buffer, -1, #PB_Ascii)
    Debug "(info) Version ACME Desk sur le serveur: " + Chr(10) + Server_Version$
    
    If ParseDate("%yyyy.%mm.%dd %hh:%ii", Actual_Version$) = ParseDate("%yyyy.%mm.%dd %hh:%ii", Server_Version$)
        MessageRequester("ACME Desk - Check Update", 
                         "Votre Version " + Actual_Version$ + " est à jour.", 
                         #PB_MessageRequester_Info)
    Else
        MessageRequester("ACME Desk - Check Update", 
                         "Votre version " + Actual_Version$ + " est obsolète." + Chr(10)+
                         "Une nouvelle version est disponible." + Chr(10) + 
                         Server_Version$, 
                         #PB_MessageRequester_Warning)
    EndIf
    
    If MemorySize(*Buffer) : FreeMemory(*Buffer) : EndIf
Else
    MessageRequester("ACME Desk - Check Update",
                     "Pas de fichier version disponible ou serveur inaccessible.", 
                     #PB_MessageRequester_Error)
EndIf

End
Désolé: c'est pas bien beau :roll: et c'est la première fois que je m'essayes aux Peek depuis mon Vic20 dans les années 80' (mieux vaut s'y remettre tard que jamais) :mrgreen:

Bref, ça fonctionne, mais c'est peut-être un peu lourd. Si vous avez des suggestions, je suis preneur.

Au début j'ai pensé faire fonctionner ReceiveHTTPMemory() en mode Asynchrone, pour l'empêcher de bloquer si le serveur est down ou si le fichier n'existe plus etc. Mais il faut alors forcer l'arrêt au bout de quelques secondes. (serveur down, connexion internet coupée etc)

Cependant, en faisant des essais avec d'autres url volontairement fausses ou même sur un serveur web local arrêté, il semble que ReceiveHTTPMemory s'arrête tout seul au bout de 2 secondes environ.

Fonctionnalité non documentée ? j'ai relu la doc network et http et rien trouvé.
(si oui, c'est très bien)

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: ~ STREAM RADIO ~ v 1.07.4

Message par Ar-S »

Je ne peux pas te répondre par contre. J'utilise le ReceiveHTTPMemory uniquement pour vérifier le numéro de la dernière version. La mise à jour je la fait par ReceiveHTTPFile (en Asynchrone)

Voilà comment je procède pour les num de version.

Code : Tout sélectionner

Procedure CatchLastVersion()
  Protected Taille, NewV$, ActuV$
  
 ; Exemple : ancienne version v$ = 1.7.2
; Nouvelle version  : un fichier txt avec ecrit : 1.7.3

; - Je vire les points
  ActuV$ = RemoveString(V$,".",0,0)
  
  *Buffer = ReceiveHTTPMemory("http://monsite/monfichier.txt")
  If *Buffer
    Taille = MemorySize(*Buffer)
    NewV$ = PeekS(*Buffer, Taille, #PB_UTF8)
   ; NewV$ récupère donc 1.7.3 
   FreeMemory(*Buffer)
    
    ; On vire les points du 1.7.3
    NV$ = RemoveString(NewV$,".",0,0)
    
    ; Une simple vérif suffit pour voir si la maj est plus récente
    If Val(ActuV$) < Val(NV$)
      UP = 1
      ; Le soft créé mon updater
      If CreateFile(#Updater, "updater.exe")
        WriteData(#Updater, ?upd, ?endupd - ?upd)
        CloseFile(#Updater)
      EndIf
      Else 
        UP = 0
        ; Au cas ou l'user est un ancien updater dans son dossier (ça doit normalement pas arriver)
        If FileSize( GetCurrentDirectory()+"updater.exe") > -1
          DeleteFile(  GetCurrentDirectory()+"updater.exe" )
        EndIf  
    EndIf 
    
  Else 
    UP = 0
  EndIf
  
  ProcedureReturn UP
EndProcedure
Ensuite mon soft l'ance l'updater qui fait la mise à jour
- recupération de l'exe à jour sous un nom bidon
- renommage de l'exe "ancien" (au cas ou ça foire je ne l'efface pas de suite)
- renommage de l'exe à jour sous le bon nom
- cette fois je supprime l'exe ancien
- je relance le nouvelle exe
- je ferme l'udater
== le nouvelle exe se lance
== il vérifie et supprime l'updater (et l'ancien exe si par hasard il est encore présent)

Voilou
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: ~ STREAM RADIO ~ v 1.07.4

Message par Zorro »

@Marc56 : tu utilises ParseDate() , mais ça fonctionne bien sans

Code : Tout sélectionner

InitNetwork()

Define Actual_Version$ = "2016.06.16 09:20" ; Valeur de test
Define Server_Version$ = ""

*Buffer = ReceiveHTTPMemory("http://metoo.free.fr/ACME_Desk_version.txt") ; , #PB_HTTP_Asynchronous)

If *Buffer
	Server_Version$ = PeekS(*Buffer, -1, #PB_Ascii)
	Debug "(info) Version ACME Desk sur le serveur: " + Chr(10) + Server_Version$ 
	If Actual_Version$ = Server_Version$
		MessageRequester("ACME Desk - Check Update", "Votre Version " + Actual_Version$ + " est à jour.")
	Else
		MessageRequester("ACME Desk - Check Update","Votre version " + Actual_Version$ + " est obsolète." + Chr(10)+"Une nouvelle version est disponible." + Chr(10) +Server_Version$)
	EndIf
	
	If MemorySize(*Buffer) : FreeMemory(*Buffer) : EndIf
Else
	MessageRequester("ACME Desk - Check Update","Pas de fichier version disponible ou serveur inaccessible.")
EndIf

End
; Epb

car si ta date change , la chaine sera forcement differente ;)
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: ~ STREAM RADIO ~ v 1.07.4

Message par Marc56 »

@Ar-S Effectivement, je dois remettre la question sur ReceiveHTTP... ailleurs :wink:
Merci pour les infos sur la mise à jour. Je pensais au début procéder à la manière des programmes de setup (l'unstall se recopie dans %tmp puis se lance pour faire lâcher le handle du fichier principal et le remplacer)

@Zorro: J'avais commencé comme cela, mais après j'ai envisagé le cas où je ré-upload un ancien fichier de version par erreur. Cela dit, ça ferait aussi une version différente.

Merci :wink:
Répondre