OVH Cloud OVH Cloud

Thread et ProgressBar

7 réponses
Avatar
forsay1
Bonjour,

Voilà mon programme met un certains temps a executer mon code !
Pour faire patienter l'utilisateur j'aimerai afficher une fenetre avec une
progress bar.

J'ai donc ajouter une form avec une progressBar.

D'apres les recherches que j'ai effectuer pour mettre a bien mon travail
j'ai decouvert le backgroundworker, cependant il n'y a d'exemple basé que sur
une seule form ! Or moi j'en ai deux .

Etant novice dans le Vb.Net j'aimerai savoir si quelqu'un pourrai me guider
pas à pas dans la realisation de cette tache afin que je comprenne plus
facilement le principe.

Merci d'avance

7 réponses

Avatar
Mathieu Francesch
Bonjour Forsay1,

Je vous ai réadapté un exemple de microsoft afin qu'il reponde à vos
attentes :

Au préalable,
Création de 2 form

Form1
Textbox1 + Button1
Form2
progressbar1

#########################################################
Public Class Form1

Private Nombre As Integer = 0
Private Pourcentage As Integer = 0
Public MaForm As New Form2
Function Factorielle(ByVal n As Integer, ByVal worker As
BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer

Dim result As Long = 0

If worker.CancellationPending Then
e.Cancel = True
Else
If n = 1 Then
Return 1
Else
result = n * Factorielle(n - 1, worker, e)
Thread.Sleep(500)
End If

Dim PourcentageCalcule As Integer = CSng(n) / CSng(Nombre) * 100
If PourcentageCalcule > Pourcentage Then
Pourcentage = PourcentageCalcule
worker.ReportProgress(PourcentageCalcule)
End If

End If

Return result
End Function


Delegate Function CalculFactorielle(ByVal n As Integer, ByVal worker As
BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer
Dim FactorielleAsynchrone As CalculFactorielle = New
CalculFactorielle(AddressOf Factorielle)
Dim Resultat As IAsyncResult

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
TextBox1.Text = "Traitement en cours"

MaForm.Show()

Pourcentage = 0
Nombre = 5
BackgroundWorker1.RunWorkerAsync(Nombre)
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As
System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
e.Result = Factorielle(e.Argument, worker, e)

End Sub

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object,
ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles
BackgroundWorker1.ProgressChanged
MaForm.ProgressBar1.Value = e.ProgressPercentage
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object,
ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles
BackgroundWorker1.RunWorkerCompleted
TextBox1.Text = e.Result.ToString
MaForm.Close()
End Sub
End Class
#########################################################

Bonne continuation,

--
Cordialement,

Mathieu Francesch
http://adonet.conceptforum.net



"forsay1" wrote:

Bonjour,

Voilà mon programme met un certains temps a executer mon code !
Pour faire patienter l'utilisateur j'aimerai afficher une fenetre avec une
progress bar.

J'ai donc ajouter une form avec une progressBar.

D'apres les recherches que j'ai effectuer pour mettre a bien mon travail
j'ai decouvert le backgroundworker, cependant il n'y a d'exemple basé que sur
une seule form ! Or moi j'en ai deux .

Etant novice dans le Vb.Net j'aimerai savoir si quelqu'un pourrai me guider
pas à pas dans la realisation de cette tache afin que je comprenne plus
facilement le principe.

Merci d'avance


Avatar
Mathieu Francesch
re bonjour,

J'apporte une petite correction à un bug que je n'avais pas vu :


On instanciera notre Form2 ici
Dans button1

MaForm = New Form2
MaForm.Show()

A bientôt,

--
Cordialement,

Mathieu Francesch
http://adonet.conceptforum.net



"forsay1" wrote:

Bonjour,

Voilà mon programme met un certains temps a executer mon code !
Pour faire patienter l'utilisateur j'aimerai afficher une fenetre avec une
progress bar.

J'ai donc ajouter une form avec une progressBar.

D'apres les recherches que j'ai effectuer pour mettre a bien mon travail
j'ai decouvert le backgroundworker, cependant il n'y a d'exemple basé que sur
une seule form ! Or moi j'en ai deux .

Etant novice dans le Vb.Net j'aimerai savoir si quelqu'un pourrai me guider
pas à pas dans la realisation de cette tache afin que je comprenne plus
facilement le principe.

Merci d'avance


Avatar
forsay1
Merci beaucoup cela marche tres bien !

par contre serai-t-il possible de mettre quelques commentaires au code car
il y a pas mal de chose que je ne comprend pas comme par exemple :

Delegate Function CalculFactorielle(ByVal n As Integer, ByVal worker As
BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer
Dim FactorielleAsynchrone As CalculFactorielle = New
CalculFactorielle(AddressOf Factorielle)
Dim Resultat As IAsyncResult

OU ENCOR a quoi correspondent les parametres dans la fonction
CalculFactorielle

Merci beaucoup d'avance en esperant que c'est pas trop embetant

"Mathieu Francesch" a écrit :

re bonjour,

J'apporte une petite correction à un bug que je n'avais pas vu :


On instanciera notre Form2 ici
Dans button1

MaForm = New Form2
MaForm.Show()

A bientôt,

--
Cordialement,

Mathieu Francesch
http://adonet.conceptforum.net



"forsay1" wrote:

> Bonjour,
>
> Voilà mon programme met un certains temps a executer mon code !
> Pour faire patienter l'utilisateur j'aimerai afficher une fenetre avec une
> progress bar.
>
> J'ai donc ajouter une form avec une progressBar.
>
> D'apres les recherches que j'ai effectuer pour mettre a bien mon travail
> j'ai decouvert le backgroundworker, cependant il n'y a d'exemple basé que sur
> une seule form ! Or moi j'en ai deux .
>
> Etant novice dans le Vb.Net j'aimerai savoir si quelqu'un pourrai me guider
> pas à pas dans la realisation de cette tache afin que je comprenne plus
> facilement le principe.
>
> Merci d'avance


Avatar
forsay1
Par contre lorsque j'adapte ce code a mon code il y a un probleme a ce niveau
:

result = n * Factorielle(n - 1, worker, e)

il me dit qu'il faut que je m'assure que je ne divise pas un nombre par 0

De plus j'ai remarqué que lorsque je clique sur mon bouton la feuille met un
certain temps avant de s'ouvrir et a deja fini mon traitement principal avant
meme que ma progressbar soit pleine

Je peux envoyer mon projet au besoin ou meme l'afficher sur ce forum!

Merci
Avatar
Mathieu Francesch
Bonjour,

Tout d'abord, désolé de ne pas avoir commenté mon code ^^

En ce qui concerne ce bout de code :
Delegate Function CalculFactorielle(ByVal n As Integer, ByVal worker As
BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer
Dim FactorielleAsynchrone As CalculFactorielle = New
CalculFactorielle(AddressOf Factorielle)
Dim Resultat As IAsyncResult

Il ne sert strictement à rien ! J'ai repris des tests que je faisais en
rajoutant votre demande et j'ai oublié de supprimer cette partie.

Si cela ne vous dérange pas, vous pouvez envoyer votre bout de code que je
complèterais et commenterais sur ce forum ou à mon adresse.


--
Cordialement,

Mathieu Francesch
http://adonet.conceptforum.net



"forsay1" wrote:

Merci beaucoup cela marche tres bien !

par contre serai-t-il possible de mettre quelques commentaires au code car
il y a pas mal de chose que je ne comprend pas comme par exemple :

Delegate Function CalculFactorielle(ByVal n As Integer, ByVal worker As
BackgroundWorker, ByVal e As DoWorkEventArgs) As Integer
Dim FactorielleAsynchrone As CalculFactorielle = New
CalculFactorielle(AddressOf Factorielle)
Dim Resultat As IAsyncResult

OU ENCOR a quoi correspondent les parametres dans la fonction
CalculFactorielle

Merci beaucoup d'avance en esperant que c'est pas trop embetant

"Mathieu Francesch" a écrit :

> re bonjour,
>
> J'apporte une petite correction à un bug que je n'avais pas vu :
>
>
> On instanciera notre Form2 ici
> Dans button1
>
> MaForm = New Form2
> MaForm.Show()
>
> A bientôt,
>
> --
> Cordialement,
>
> Mathieu Francesch
> http://adonet.conceptforum.net
>
>
>
> "forsay1" wrote:
>
> > Bonjour,
> >
> > Voilà mon programme met un certains temps a executer mon code !
> > Pour faire patienter l'utilisateur j'aimerai afficher une fenetre avec une
> > progress bar.
> >
> > J'ai donc ajouter une form avec une progressBar.
> >
> > D'apres les recherches que j'ai effectuer pour mettre a bien mon travail
> > j'ai decouvert le backgroundworker, cependant il n'y a d'exemple basé que sur
> > une seule form ! Or moi j'en ai deux .
> >
> > Etant novice dans le Vb.Net j'aimerai savoir si quelqu'un pourrai me guider
> > pas à pas dans la realisation de cette tache afin que je comprenne plus
> > facilement le principe.
> >
> > Merci d'avance


Avatar
forsay1
J'ai envoyé tt le code a votre adresse mail

Bonne reception
Avatar
Mathieu Francesch
Merci,

J'ai bien reçu votre programme, j'y ai apporté quelques modifications et
vous l'ai retourné. Je suis à votre disposition si vous avez la moindre
question.

Bonne soirée,


--
Cordialement,

Mathieu Francesch



"forsay1" wrote:

J'ai envoyé tt le code a votre adresse mail

Bonne reception