URLDownloadToFile doevents

Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
- 24 sept. 2014 à 11:59
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
- 4 oct. 2014 à 18:53
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.
0
NHenry
Messages postés
14968
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 août 2022
161
24 sept. 2014 à 13:47
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).
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
24 sept. 2014 à 14:27
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.
0
NHenry
Messages postés
14968
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 août 2022
161
24 sept. 2014 à 14:46
Comme je l'ai dit, la fonction est bloquante, donc à moins de la séparer sur un autre thread, ton interface ne bougera pas tant que la fonction n'aura pas fini son travail.
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
24 sept. 2014 à 14:53
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 ?
0
NHenry
Messages postés
14968
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 août 2022
161
24 sept. 2014 à 15:01
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)
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
24 sept. 2014 à 15:22
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.
0
NHenry
Messages postés
14968
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
13 août 2022
161
Modifié par NHenry le 24/09/2014 à 15:53
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.
0
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 ;)
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
Modifié par Herve_be le 25/09/2014 à 08:58
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ucfoutu
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
235
24 sept. 2014 à 22:06
0
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.
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
25 sept. 2014 à 16:14
Merci pour l'intention.
Backgroundworker ne fonctionne pas en VB6 mais j'ai lu uneméthode qui permet de l'importer en .net puis de le faire tourner en VB6 mais c'est trop compliqué pour en valoir la peine.
0
Sinon, à propos du bug StillExecuting, il y a une note sur msdn ici -> http://support.microsoft.com/kb/182152/fr

Dans Visual Basic, la valeur True est égale à -1 et False est égale à 0.

Lors de l'exécution du contrôle Internet Transfer, comparant la propriété StillExecuting avec True échoue. Une alternative consiste à comparer StillExecuting à toute autre valeur que la valeur False (0).

Lorsque le contrôle Internet Transfer n'est pas en cours d'exécution, la propriété StillExecuting a la valeur 0 (faux) correcte.

Bonne soirée.
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
26 sept. 2014 à 18:30
Bonsoir,
J'avais vu cette note mais si au lieu de faire while ... loop je fait
Do Until inet.StillExecuting = False
DoEvents
Loop
c'est lamême chose : VB6 boucle puis après "un certain temps" message "VB6 a cessé de fonctionner.
0
Dans Visual Basic, la valeur True est égale à -1
Il faut tester ceci surement.
0
Herve_be
Messages postés
957
Date d'inscription
mercredi 4 août 2010
Statut
Membre
Dernière intervention
5 août 2022
2
Modifié par Herve_be le 26/09/2014 à 21:54
Do Until inet.StillExecuting = False
DoEvents
Loop
ça boucle !
While inet.StillExecuting
DoEvents
Loop
ça boucle !!
0