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)
...

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!

Technique simple et efficace pour ne pas faire trop de pooling sur l'état de la progression

(Je met ça de côté: penser à utiliser un Timer. Merci)

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

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)
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)

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
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
