Page 1 sur 1

HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 16:24
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 ?

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 16:39
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:

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 16:47
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é

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 16:55
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

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 17:07
par Ar-S
Ok merci !
En fait mon timer ne sert à rien ! oO

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 17:07
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:

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 17:15
par Ar-S
@Marc56, le timer était pour mon projet mais au final il ne (me) sert à rien.

Re: HTTPProgress et bindevent ?

Publié : jeu. 16/juin/2016 17:20
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 ?) :|

Re: ~ STREAM RADIO ~ v 1.07.4

Publié : ven. 17/juin/2016 9:11
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:

Re: ~ STREAM RADIO ~ v 1.07.4

Publié : ven. 17/juin/2016 9:36
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

Re: ~ STREAM RADIO ~ v 1.07.4

Publié : ven. 17/juin/2016 9:39
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 ;)

Re: ~ STREAM RADIO ~ v 1.07.4

Publié : ven. 17/juin/2016 9:51
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: