j'arrive pas peux tu m'aider a faire le code stp.
j'arrive pas peux tu m'aider a faire le code stp.
voila mon code :
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
40
41
42
43
44
45
46 Public Function downloadFTP(ByVal Cheminfile As String, ByVal URL As String, ByVal bk As String, ByVal pw As String, ByVal Er As String) As String Form1.ProgressBar1.Value = 0 Form1.ProgressBar1.Visible = True Dim requ As FtpWebRequest Dim resp As FtpWebResponse Dim respStrm As Stream = Nothing Dim fileStrm As FileStream = Nothing Dim filename As String requ = CType(WebRequest.Create(URL), FtpWebRequest) requ.Credentials = New NetworkCredential(bk, pw) requ.Method = WebRequestMethods.Ftp.DownloadFile resp = CType(requ.GetResponse(), FtpWebResponse) respStrm = resp.GetResponseStream() filename = Path.GetFileName(requ.RequestUri.LocalPath) fileStrm = File.Create(Cheminfile & "\" & filename) Dim buff(1024) As Byte Dim bytesread As Integer = 0 While (True) Try bytesread = respStrm.Read(buff, 0, buff.Length) If (bytesread = 0) Then Exit While fileStrm.Write(buff, 0, bytesread) Form1.bgw.ReportProgress((bytesread * 100) / buff.Length, "Téléchargement du fichier : " & filename) Catch ex As Exception Er = ex.message If respStrm IsNot Nothing Then respStrm.Close() If fileStrm IsNot Nothing Then fileStrm.Close() End Try End While Er = "Download de " Form1.ProgressBar1.Visible = False Return Er End Function
[B]Bon j'ai bien fais de te demander ce que tu tentais de faire car de ce que je lis tu n'as pas compris l'utilisation du BGW puisque le corps de ta fonction appelante (downloadFTP) se situe à l’extérieur de ton gestionnaire d’événements "DoWork" !!!
Je récapitule :
Le BGW est un gestionnaire de type "Thread UI" (Tache d'arrière-plan + mise à jour Interface du logiciel).
Tout le code suivant :
- susceptible de geler ton interface à cause de longues opérations de traitements
- susceptible de mettre à jour tes contrôles (listView, listbox, fonction dessin,...etc...)
.....etc....
doit être initié depuis le gestionnaire d'évènements "DoWork" (RunWorkerAsync). Donc le code est placé dans le corps de la Sub "DoWork".
En revanche si tu dois mettre à jour un contrôle tu devras appeler le gestionnaire d’événements "ProgressChanged" (ReportProgress)
Enfin le gestionnaire d’événements "RunWorkerCompleted" est l'aboutissement du thread initié au tout début, et dans cette Sub il est possible de récupérer une annulation, une erreur, un accomplissement du process sans problèmes rencontrés.
Je ne te donnerais pas cette fois-ci de code tout fait.
Désolé il faut y mettre un peu de ta personne, ce code copié/collé depuis la toile montre bien que tu n'as pas saisis le concept.
Bonne continuation.
A+
Ok merci bien pour ce que tu as fait jusqu’à maintenant.
Je n'ai qu'une initiation de VB par ma boite... j'attend un prochain DIF pour continuer... je fais avec ce que j'ai appris, désoler mais le bgw je ne connaissais pas et comme je t'ais dit dans un message précédent je n'ai pas compris le fonctionnement, c'est pas faute de l'avoir dit...
Aujourd'hui sincèrement je n'ai pas le temps pour me pencher dessus et m'y mettre a fond... j'ai d'autre souci à gérer pour m'y consacrer franchement et comprendre le fonctionnement complet de ce gestionnaire !!
j'ai posté clairement sur le forum pour avoir de l'aide pour savoir comment remplir la progressbar, c'est clair que je ne m'attendais pas que le fonctionnement serait avec un thread // et je ne demande pas non plus d'être jugé ou autre... mais bon de nos jour c'est clair que c'est la société qui veux cela.
merci bonne continuation de même
Cela fait quelques réponse que je te soumet pour aboutir finalement sur de telles absurdités sur la société et que tu n'as pas le temps pour creuser le sujet !!!
Quand qqun ne veut pas s'investir je ne vois pas pourquoi je continuerais à lui prêter main forte ! Dans la vie on n'a rien sans rien.
Bonne continuation.
PS : il n'existe pas que le BGW comme énoncé dans les précédentes réponses !
et oui je n'ai pas le temps pour le moment, une fois de plus tu es qui pour juger quelqu'un !!!! là il est 07h je suis au travail, je fini à 17h ensuite je passe mon temps tous les jours dans une association pour distribuer des repas que j’élabore juste avant avec plusieurs bénévoles… je rentre chez moi vers 21h30/22h… j’ai une femme et 4 enfants donc oui j’ai pas le temps… mais t’inquiète pas tu n’es pas tout seul à avoir ce genre de comportement c’est vrai que je si je me mettais à ton niveau, je me mettrais à juger les gens pour savoir s’il s’investisse dans leur vie pour mériter ce qu’on leur offre tous les jours. Aider, tu sais ce que sa veux dire toi…
Il ne faut pas se mettre dans de tels états o_O
On a tous nos obligations dans nos vies et je n'étalerais pas les miennes ce n'est pas le sujet !
Il faut que tu comprennes que lorsque 2 individus ne parlent pas le même langage, qu il faut un moment ou un autre que l un des 2 fasse un effort afin de conserver un échange cohérent.
En l'occurence tu demandes de l'aide et tu ne comprends pas de quoi je te parle alors.....faut il vraiment qu on débatte pour savoir qui pisse le plus loin....??
Donc pour reformuler tout ca :
De l'aide je suis toujours prêt a t'en donner mais lorsque tu pourras pleinement te consacrer au sujet que tu as créés et que tu seras en mesure de parler le même langage que ceux qui s'octroient un peu de leur temps libre dans leur journée de travail pour venir en aide, en toute modestie, à ceux qui le demande.
Cdlt.
ok pas de problème et merci
voici le code que j'utilise pour faire un downlaod
ce code fonctionne parfaitement donc je vais le coupler avec le bgw, quoi essayer....
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 Public Function downloadFTP(ByVal Cheminfile As String, ByVal URL As String, ByVal bk As String, ByVal pw As String, ByVal Er As String) As String Dim requ As FtpWebRequest = CType(WebRequest.Create(URL), FtpWebRequest) requ.Credentials = New NetworkCredential(bk, pw) requ.Method = WebRequestMethods.Ftp.DownloadFile Dim resp As FtpWebResponse = CType(requ.GetResponse(), FtpWebResponse) Dim respStrm As Stream = resp.GetResponseStream() Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath) Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename) Dim buff(1024) As Byte Dim bytesread As Integer = 0 While (True) Try bytesread = respStrm.Read(buff, 0, buff.Length) If (bytesread = 0) Then Exit While fileStrm.Write(buff, 0, bytesread) Catch ex As Exception Er = ex.Message If respStrm IsNot Nothing Then respStrm.Close() If fileStrm IsNot Nothing Then fileStrm.Close() Return Er Exit Function End Try End While respStrm.Close() fileStrm.Close() Er = "Download de " Return Er End Function
donc
Voilà en partie mon code je lance le traitement asynchrone par le biais d'un click, puis le dowork execute le traitement et le ProgressChangedEventArgs me rempli ma barre...
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
40
41
42
43
44
45
46 Dim Url As String = "" Dim Cheminfile As String = "" Dim Barmax As Integer Private Sub Label4_Click(sender As Object, e As EventArgs) Handles Label4.Click ProgressBar1.Value = 0 Url = "ftp://xx.xx.xxx.x/monfichier.txt" Cheminfile = "C:\prog\" Barmax = 0 bgwDown.RunWorkerAsync() End Sub Private Sub bgw_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwDown.DoWork '1) 1ère requette pour la récupereration de la taille du fichier Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest) requ.Credentials = New NetworkCredential(user, mdp) requ.Method = WebRequestMethods.Ftp.GetFileSize Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse) Barmax = CInt(ftpResponse.ContentLength) '2) 2ème requette pour la recuperation du fichier car sa plante sinon requ = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest) requ.Credentials = New NetworkCredential(user, mdp) requ.Method = System.Net.WebRequestMethods.Ftp.DownloadFile Dim respStrm As Stream = ftpResponse.GetResponseStream() Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath) Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename) While (True) Bla bla.. bgwDown.ReportProgress(bla.., blaa.., "Hébergement du fichier : " & New FileInfo("YourFilePath").Name) End While respStrm.Close() fileStrm.Close() Er = "Download de " Return Er End Sub Private Sub BbgwDown_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwDown.ProgressChanged If Not e.ProgressPercentage > 100 Then ProgressBar1.Maximum = Barmax ProgressBar1.Value = e.ProgressPercentage End If End Sub
est ce que je suis sur la bonne voie là.. par contre le processus principal lui continu ou attend que le 2cd processus soit finit...
bon si c'est good je passe à la boucle..
merci
Salut tijote,
Lorsque tu lances le BGW : bgwDown.RunWorkerAsync()
Tu récupères obligatoirement l'accomplissement dans la Sub : bgwDown_RunWorkerCompleted
Je veux dire par là que si tu inities le BGW tu dois obligatoirement récupérer la fin du processus à cet endroit : bgwDown_RunWorkerCompleted()
ex :
1- Tu grises des boutons : titi.enabled=false, toto.enabled=false,...etc...
2- Tu lances le processus : BGW.RunWorkerAsync()
3- Le processus est terminé : bgwDown_RunWorkerCompleted()
4- Tu remets les controles à leur état initial : titi.enabled=true, toto.enabled=true,...etc... dans la Sub bgwDown_RunWorkerCompleted()
A+
salut
donc j'ai modifié le label en button et rajouté le bgwDown_RunWorkerCompleted
je récupère bien le fichier mais la progressbar déconne, je n'arrive pas à l’incrémenter par rapport au tableau de byte
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 Dim Url As String = "" Dim Cheminfile As String = "" Dim Barmax As Integer Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Button2.Enabled = False ProgressBar1.Visible = True ProgressBar1.Value = 0 Url = "ftp://xx.xx.xxx.x/monfichier.txt" Cheminfile = "C:\prog\" Barmax = 0 If not bgwDown.isbusy then bgwDown.RunWorkerAsync() End if End Sub Private Sub bgwDown_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwDown.DoWork Dim buffer(1024) As Byte Dim bytesSoFar As Long = 0 Dim bytesread As Integer = 0 '1) 1ère requette pour la récupereration de la taille du fichier Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest) requ.Credentials = New NetworkCredential(user, mdp) requ.Method = WebRequestMethods.Ftp.GetFileSize Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse) Barmax = CInt(ftpResponse.ContentLength / 1024) '2) 2ème requette pour la recuperation du fichier car sa plante sinon requ = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest) requ.Credentials = New NetworkCredential(user, mdp) requ.Method = System.Net.WebRequestMethods.Ftp.DownloadFile ftpResponse = DirectCast(requ.GetResponse(), FtpWebResponse) Dim respStrm As Stream = ftpResponse.GetResponseStream() Dim filename As String = Path.GetFileName(requ.RequestUri.LocalPath) Dim fileStrm As FileStream = File.Create(Cheminfile & "\" & filename) bytesread = 1 Do Until bytesread < 1 If bytesread > 0 Then bytesread = respStrm.Read(buffer, 0, 1024) fileStrm.Write(buffer, 0, bytesread) bgwDown.ReportProgress((bytesread * 100) / Barmax, "Hébergement du fichier : " & New FileInfo(filename).Name) End If Loop respStrm.Dispose() fileStrm.Dispose() End Sub Private Sub BbgwDown_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwDown.ProgressChanged If Not e.ProgressPercentage > 100 Then ProgressBar1.Maximum = Barmax ProgressBar1.Value = e.ProgressPercentage End If End Sub Private Sub bgwDown_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwDown.RunWorkerCompleted Button2.Enabled = True ProgressBar1.Value = 0 ProgressBar1.Visible = False End Sub
voici une petit video
Je regarderais en detail a la maison ce soir. Cependant juste une remarque :
Avec ton code actuel quand tu cliques sur le bouton pour lancer ton BGW penses bien a verifier que le process ne soit pas deja en cours d execution au quel cas une erreur pourrait survenir ! Pour parer a ca :
Il faut bien parcourir toutes les methodes disponibles pour un composant de la boite a outils.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 If not bgwDown.isbusy then bgwDown.RunWorkerAsync() End if
A+
Voilà ce que ca donne avec les commentaires, j'espère que ca te permettra d'avancer dans ton projet :
N'oublies pas de gérer l'annulation du process dans la boucle "do while" et la gestion du retour d'erreur d'annulation dans le "WorkerCompleted".
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 Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Try 'Identification Dim reqFTP As FtpWebRequest reqFTP = DirectCast(FtpWebRequest.Create(New Uri("FTPURI")), FtpWebRequest) reqFTP.UseBinary = True reqFTP.Credentials = New NetworkCredential("USERNAME", "PASSWORD") 'requête FTP.Méthode = DownloadFile reqFTP.Method = WebRequestMethods.Ftp.DownloadFile Dim respons As FtpWebResponse = DirectCast(reqFTP.GetResponse(), FtpWebResponse) 'récupération de la taille de la requête = taille du fichier puisque c'est ce que tu demandes ! Dim fileLength As Long = respons.ContentLength 'On travaille avec le flux Using responseStream As IO.Stream = respons.GetResponseStream ' On créé un fichier pour réceptionné les données copiées ainsi on peut quantifier ce qui est recu Using fs As New IO.FileStream("C:\TempPathFile.exe", IO.FileMode.Create) Dim buffer(2048) As Byte Dim bytesread As Integer = 0 Dim bytesSoFar As Integer Do bytesread = responseStream.Read(buffer, 0, buffer.Length) fs.Write(buffer, 0, bytesread) bytesSoFar += bytesread BackgroundWorker1.ReportProgress((bytesSoFar * 100) / fileLength, "Téléchargement du fichier : ") Loop Until bytesread = 0 responseStream.Close() fs.Flush() fs.Close() End Using responseStream.Close() End Using Catch ex As Exception MsgBox(ex.ToString) End Try End Sub
PS : comme précédemment mentionné, je rappelle qu'il y a une méthode bien plus simple à l'aide de la classe WebClient mais tu voulais l'exemple avec le BGW donc c'est chose faite.
A+
merci beaucoup pour ton aide, je vais regarder dès que j'arrive au boulot... et je te tiens au jus
j'ai une erreur sur le bgwDown.ProgressChanged
fileLength = -1
bytesread = 2049
donc le calcul de bgwDown.ReportProgress((bytesSoFar * 100) / fileLength, "Téléchargement du fichier : ") = -204900
je récupère en 1er la taille avant :
la ça fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 '1) 1ère requette pour la récupereration de la taille du fichier Dim requ As FtpWebRequest = DirectCast(System.Net.FtpWebRequest.Create(Url), System.Net.FtpWebRequest) requ.Credentials = New NetworkCredential(user, mdp) requ.Method = WebRequestMethods.Ftp.GetFileSize Dim ftpResponse As System.Net.FtpWebResponse = DirectCast(requ.GetResponse(), FtpWebResponse) Dim fileLength As Long = ftpResponse.ContentLength
Tu n as pas besoin d etablir une autre requete pour obtenir la taille du fichier !
C est ainsi que tu la recuperes :
Le snippet provient d un projet que j ai specialement concocté pour illustrer ton exemple. Il fonctionne tres bien puisque je l ai debogué avant de poster.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Dim fileLength As Long = respons.ContentLength
Je te poste le projet en arrivant ce soir a la maison.
A+
Voilà le code de l'exemple complet avec la gestion d'erreur à la sortie du Thread :
Ce projet de type "Windows Form" nécessite :
- 1 formulaire (nommé Form1 par défaut)
- 1 Progressbar (nommée Progressbar1 par défaut)
- 1 backgroundWorker (nommé backgroundWorker1 puis paramétré avec la propriété "WorkerReportsProgress=True")
C'est tout !
A+
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 Imports System.Net Imports System.IO Public Class Form1 Private _ftpUri As String = "" Private _userName As String = "" Private _password As String = "" Private _OutputFilePath As String = "" Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load If Not BackgroundWorker1.IsBusy Then BackgroundWorker1.RunWorkerAsync() End If End Sub Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Try 'Identification Dim reqFTP As FtpWebRequest reqFTP = DirectCast(FtpWebRequest.Create(New Uri(_ftpUri)), FtpWebRequest) reqFTP.UseBinary = True reqFTP.Credentials = New NetworkCredential(_userName, _password) 'requête FTP.Méthode = DownloadFile reqFTP.Method = WebRequestMethods.Ftp.DownloadFile Dim respons As FtpWebResponse = DirectCast(reqFTP.GetResponse(), FtpWebResponse) 'récupération de la taille de la requête = taille du fichier puisque c'est ce que tu demandes ! Dim fileLength As Long = respons.ContentLength 'On travaille avec le flux Using responseStream As IO.Stream = respons.GetResponseStream ' On créé un fichier pour réceptionné les données copiées ainsi on peut quantifier ce qui est recu Using fs As New IO.FileStream(_OutputFilePath, IO.FileMode.Create) Dim buffer(2048) As Byte Dim read As Integer = 0 Dim count As Integer Do read = responseStream.Read(buffer, 0, buffer.Length) fs.Write(buffer, 0, read) count += read BackgroundWorker1.ReportProgress((count * 100) / fileLength, "Téléchargement du fichier : ") Loop Until read = 0 responseStream.Close() fs.Flush() fs.Close() End Using responseStream.Close() End Using e.Result = "Completed" Catch ex As Exception e.Result = New Exception("Error", ex) End Try End Sub Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged If Not e.ProgressPercentage > 100 Then Me.ProgressBar1.Value = e.ProgressPercentage Me.Text = e.UserState.ToString End If End Sub Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted If e.Cancelled Then MsgBox("Processus annulé !") Else If TryCast(e.Result, Exception).Message = "Error" Then MessageBox.Show("Une erreur est survenue ! " & vbNewLine & TryCast(e.Result, Exception).InnerException.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error) ElseIf e.Result.ToString = "Completed" Then MessageBox.Show("Téléchargement terminé !", "Fin", MessageBoxButtons.OK, MessageBoxIcon.Information) End If End If End Sub End Class
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager