URLDownloadToFile doevents

Signaler
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
-
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
-
Bonjour,
Je télécharge des fichiers sur Internet sans problème comme ceci
Private Declare Function URLDownloadToFile Lib "urlmon" _
Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL _
As String, ByVal szFileName As String, ByVal dwReserved As Long, _
ByVal lpfnCB As Long) As Long

Public Function DownloadFile(URL As String, LocalFilename As String) As Boolean
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, URL, LocalFilename, 0, 0)
If lngRetVal = 0 Then DownloadFile = True
End Function
Pendant le téléchargement j'active un timer qui fait clignoter un label pour faire patienter
Private Sub Timer_Timer()
If Version.Visible = True Then Version.Visible = False Else Version.Visible = True
Me.Refresh
End Sub

Timer.Enabled = True
Call DownloadFile("http://www.rudyv.be/Aquarium/Calculateurs/Cheat.par", ParFileName)
Timer.Enabled = False
mais ça ne fonctionne pas : pendant le téléchargement, le timer ne reçoit jamais contrôle.
Comment faire ?

6 réponses

Salut,

Il faut vérifier si l'api URLDownloadToFile bloque le code pendant le téléchargement de ton fichier. Si il ne bloque pas le code, l'instruction
Timer.Enabled = False
doit être supprimée.

EDIT: D'apres msdn http://msdn.microsoft.com/en-us/library/ie/ms775123%28v=vs.85%29.aspx, tu peux mettre en oeuvre un Callback pour surveiller la progression du téléchargement de ton fichier et ainsi désactiver ton timer à la fin de l'opération.
Bonne prog.
Messages postés
14676
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 juillet 2020
143
Cette fonction bloque le fil d'exécution en attendant la fin du téléchargement.
Je te conseil de t'intéresser au contrôle BackGroundWorker et aux Threads (Attention aux appels à des contrôles de ta form dans ton thread, cela n'est pas permit).
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
Merci pour vos 2 réponses mais je trouve que c'est bien compliqué pour un gadget.
En fait le fichier à télécharger est très petit (moins d'un kB), mais il se fait que parfois la connexion met "un certain temps" à s'établir.
Je voudrais simplement afficher "quelque chose qui bouge" pendant le téléchargement; je fais clignoter un label à l'aide d'un timer mais toute autre idée dans le même sens est bienvenue.
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
J'ai bien compris mais il y a peut-être une solution plus simple, le but n'étant pas du tout de faire une barre de progression.
Par exemple avant de lancer URLdownload je change l'icone de la souris en VBhourglass, qui bouge, mais pas assez visible.
N'y a-t-il pas moyen d'afficher quelque chose qui bouge tout seul, un gif animé par exemple, peu importe ?
Messages postés
14676
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 juillet 2020
143
Pour que ton interface bouge, il faut lui permettre de gérer les événements en attente (même pour un simple GIF animé, cela nécessite au minimum un rafraichissement d'une image, donc un événement).
Tant que ta fonction bloque un événement (Timer, Bouton_Click, ...), ta form ne pourra pas traiter d'autres événements.

Le BackGroundWorker est très simple d'utilisation, regardes un peu sur le net, tu verras, tu as 3 choses à utiliser dedans (noms fournis de têtes) :
- L'événement du thread (DoWork il me semble)
- Start, pour lancer le thread
- IsAlive pour vérifier si il fonctionne encore (False, ton Download es fini)
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
Avant d'examiner, je voudrais savoir s'il implique l'installation d'un DLL ou OCX, parce que je ne peux pas demander à tous les utilisateurs de le faire, merci.
Messages postés
14676
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 juillet 2020
143
Il est fourni avec le framework .NET

Euh, je viens de voir que tu dev en VB6 et je ne sais pas pourquoi, je me suis bloqué en .NET.

En même temps, je me demande encore pourquoi autant de gens dev en VB6 alors qu'il est mort depuis plus de 12 ans.

Je fais une pause, et je reviens un peu plus tard.
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
"pourquoi autant de gens dev en VB6" : parce que c'est un "vieux" logiciel qui s'est progressivement étoffé qu'il serait maintenant fastidieux de le convertir en .NET.
J'ai trouvé un moyen de faire tourner BackGroundWorker en VB6 mais c'est trop compliqué pour en valoir la peine.
Pour vb6, tu peux remplacer ton api par le composant dédié aux téléchargements: Inet (MSINET.OCX)
Un exemple avec progressbar pour ce composant ici -> http://www.codeitbetter.com/download-file-inet-control-progress/

Un bonjour a NHenry en passant ;)
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
Bonjour,
Remplacer l'API par INET est une bonne idée, d'autant plus que j'utilise déjà Inet dans ce programme pour envoyer un fichier vers le serveur (PUT).
Le problème est qu'avec ce Put la boucle d'attente
While .StillExecuting
DoEvents
Wend
boucle indéfiniment alors que sans cette boucle l'upload fonctionne très bien.
J'ai donc peur d'avoir le même problème avec GET.
Si tu avais une idée de l'origine de ce problème, j'avais posé la question ici http://codes-sources.commentcamarche.net/forum/affich-10034342-uploader-un-fichier#18 mais je n'ai pas eu de réponse valable.
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
226
Bonjour ucfoutu et content de te lire,

Merci pour ton lien et non je n'avais pas lu ce fil de discussion. Je ne vais plus m'investir autant qu'avant sur ce site. Là je vais radoter; je n'arrive pas à suivre le déroulement de la conversation quand il y a trop de messages.
Ces discussions 'spaghetti' sont insupportables et inadaptées sur un forum de programmation.

@Herve_be,
Si je m'y connaissais un peu en vb6, je t'aurais aidé volontiers à mettre en oeuvre ce fameux CallBack (paramètre lpfnCB de ton api) mais je ne sais pas faire avec ce langage. Je ne sais même pas si vb6 le permet.
Messages postés
14676
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 juillet 2020
143
Et
Do while inet.StillExecuting = True
?
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
Quelle différence avec
While inet.StillExecuting ?
Messages postés
14676
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
8 juillet 2020
143
True est Not False.
MaVar=5
If MaVar Then 'True alors que <>True car <>-1
Salut NHenry,

Il faut tester -1 (moins 1) mais le demandeur n'a pas compris...
Messages postés
762
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
6 juillet 2020
2
Do While Inet.StillExecuting = -1
DoEvents
Loop
ça boucle !