IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Aide téléchargement Async [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Aide téléchargement Async
    Bonjour à tous,

    Je viens vers vous après plusieurs recherches sur le net sans succès ^^.

    Alors je vous explique mon problème, Je suis en train de créer un launcher qui doit télécharger plusieurs fichiers .zip qui sont ensuite décompressé. De ce coté il n'y a aucun problème, mais ce que je voudrait c'est de faire une barre de progression qui affiche ou en est le téléchargement. J'ai donc suivis ce tutoriel: http://www.dreamincode.net/forums/to...h-progressbar/ , ce qui donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
        Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
            Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
            Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
            Dim percentage As Double = bytesIn / totalBytes * 100
     
            pboProgress.Value = Int32.Parse(Math.Truncate(percentage).ToString())
        End Sub
     
        Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
            MessageBox.Show("Download Complete")
            Button2.Text = "Start Download"
            Button2.Enabled = True
        End Sub
     
        Private Sub downloadAsyn(ByVal fichier As String)
            Dim client As WebClient = New WebClient
            AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
            AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
            client.DownloadFileAsync(New Uri("url"), "destination")
            'Cette boucle permet d'attendre la fin du téléchargement avant de continuer
            While client.IsBusy
                System.Threading.Thread.Sleep(1)
            End While
        End Sub
    j'ai rajouter une boucle pour attendre la fin du téléchargement avant de continuer, et c'est cette boucle qui bloque la fonction client_ProgressChanged.

    Je voudrait donc savoir comment attendre la fin du téléchargement sans cette boucle ou alors récupérer la taille de donné restante, pour la barre de progression, directement dans cette boucle.

    Merci d'avance pour votre aide, je reste à votre disposition si vous avez besoin de plus d'informations.

  2. #2
    Membre à l'essai
    Homme Profil pro
    ISAE-ENSMA
    Inscrit en
    Juin 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : ISAE-ENSMA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2014
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Bonjour,

    Je ne maîtrise pas forcément non plus l'asynchrone mais ne serait-il pas plus simple de lancer ton téléchargement dans un BackgroundWorker ?

    Et pour obtenir la fin de ton téléchargement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub BackgroundWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted
            MessageBox.Show("Download Complete")
            Button2.Text = "Start Download"
            Button2.Enabled = True    
            client.Close()
    End Sub

  3. #3
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par ValNyz Voir le message
    Bonjour,

    Je ne maîtrise pas forcément non plus l'asynchrone mais ne serait-il pas plus simple de lancer ton téléchargement dans un BackgroundWorker ?
    Le composant backgroundworker est asynchrone donc cela revient au même.
    Mais il est tout a fait possible de gérer le DL multiple de fichiers avec la classe webclient.. en mettant les fichiers dans une list "queue".....
    Je montrerai tout ca ce soir quand je serai rentré du taf.





    A+

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,

    Merci de vos réponse . Mais je veux pas télécharger via une queue, le problème n'est pas là. Ce que je veux c'est que le programme attende la fin du téléchargement avant de le décompresser, je pourrais faire un téléchargement non asynchrone et ça marcherais mais dans ce cas je ne pourrais pas faire la barre de téléchargement. J'ai essayé de faire le téléchargement dans un autre thread et d'utiliser la fonction join() mais elle n'attend pas la fin du téléchargement ^^. Du coup je me retrouve bloquer, je pourrais faire sans barre de téléchargement, mais avec 6Go a télécharger ce serais bien que l'utilisateur sache où il en est.

  5. #5
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Je ne comprends pas pourquoi tu places ce bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      'Cette boucle permet d'attendre la fin du téléchargement avant de continuer
            While client.IsBusy
                System.Threading.Thread.Sleep(1)
            End While

    ....ça sert à rien car tu bloques ton thread !

    IMPORTANT : tu t'es abonnés à l'event suivant (dès lors que l'utilisateur a cliqué sur le bouton pour lancer le téléchargement) :
    "AddHandler client.DownloadFileCompleted, AddressOf DownloadFileEx_DownloadFileCompleted"
    donc la sub "DownloadFileEx_DownloadFileCompleted" corresponds à l'emplacement de la fin de ton téléchargement !!


    Mon projet exemple :

    http://imabox.fr/a3/1411062324H36cqU58.png

    - 1 Form
    - 1 button
    - 1 Progressbar


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    Imports System.IO
    Imports System.Net
    Imports System.ComponentModel
     
    Public Class Form1
     
        Private _destPath$ = "C:\DownloadedFiles"
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If Not Directory.Exists(_destPath) Then Directory.CreateDirectory(_destPath)
            DownloadFileEx()
        End Sub
     
        Private Sub DownloadFileEx()
            Dim client As New WebClient()
            AddHandler client.DownloadProgressChanged, AddressOf DownloadFileEx_DownloadProgressChanged
            AddHandler client.DownloadFileCompleted, AddressOf DownloadFileEx_DownloadFileCompleted
     
            Dim item$ = "http://wallace87000.upd.fr/DotNetPatcher.exe"
            Dim fiName As New FileInfo(New Uri(item).AbsolutePath)
            client.DownloadFileAsync(New Uri(item), _destPath & "\" & fiName.Name)
        End Sub
     
        Private Sub DownloadFileEx_DownloadProgressChanged(sender As Object, e As DownloadProgressChangedEventArgs)
            ProgressBar1.Value = e.ProgressPercentage
        End Sub
     
        Private Sub DownloadFileEx_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
            If e.Error IsNot Nothing Then
                MsgBox(e.Error.ToString)
            End If
            MsgBox("Download Completed !")
     
            'C'est ici la fin du téléchargement !
            'Donc c'est ici qu'on décompresse les fichiers Zip et pas ailleurs.
            'Si tu ne veux pas que ta partie UI gèle pendant la décompression de ton gros fichier alors il faut créer un autre thread que tu appelleras ici !
        End Sub
    End Class

    A+

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup, c'est exactement ce qu'il me fallais

    Je n'avais pas bien compris le fonctionnement des handler en vb.net, mais maintenant c'est bon

  7. #7
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par fauconjona Voir le message
    Merci beaucoup, c'est exactement ce qu'il me fallais

    Je n'avais pas bien compris le fonctionnement des handler en vb.net, mais maintenant c'est bon

    Mais il s'agit là d'une première étape.
    Ce q'il serait bon d'expérimenter maintenant c'est de créer toi même tes propres classes avec tes events et delegates


    Bonne continuation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/10/2012, 18h32
  2. aide téléchargement libcs.dll
    Par rose_wila dans le forum Sybase
    Réponses: 2
    Dernier message: 03/02/2011, 20h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo