getule Posté(e) le 13 novembre 2011 Share Posté(e) le 13 novembre 2011 (modifié) Le composant BackgroundWorker du framework .net permet d’utiliser un "multithreading" facilement. source http://forum.diafdz.com/yaf_postsm24_Comment-travailler-avec-un-BackgroundWorker-vb-net.aspx#post24 prenons un exemple utile. durant le temps de la connexion à la base de donnée d'un LoginForm, celle ci parait bloquée (Freeze de l'interface utilisateur). au lieu d'utiliser un multithreading, voyons cela avec le BackgroundWorker. Nous allons utiliser une ProgressBar pour faire patienter l'utilisateur durant la connexion à la base. [left][color=#000000][font=Consolas]Public username, password, tt As String ' Déclarons username et pasword et une valeur tt comme des string[/font][/color] [color=#000000][font=Consolas] Public c As Boolean 'déclarons c comme booléen[/font][/color] [color=#000000][font=Consolas]Private Sub LoginForm2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load[/font][/color] [color=#000000][font=Consolas] Me.ProgressBar1.Visible = False 'mettons la progressbar en mode invisible au chargement de la loginform[/font][/color] [color=#000000][font=Consolas]'évènement du bouton Ok[/font][/color] [color=#000000][font=Consolas] Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click[/font][/color] [color=#000000][font=Consolas] Me.ProgressBar1.Visible = True 'mettons la progressbar visible[/font][/color] [color=#000000][font=Consolas] username = Me.UsernameTextBox.Text [/font][/color] [color=#000000][font=Consolas] password = PasswordTextBox.Text[/font][/color] [color=#000000][font=Consolas] Me.BackgroundWorker1.RunWorkerAsync() 'lançons le composant BackgroundWorker en mode asynchrone[/font][/color] [color=#000000][font=Consolas] End Sub[/font][/color] [color=#000000][font=Consolas] Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click[/font][/color] [color=#000000][font=Consolas] Me.Close()[/font][/color] [color=#000000][font=Consolas] End Sub[/font][/color] [color=#000000][font=Consolas]'c'est ici dans la procédure de l'évènement DoWork qu'on va se connecter à la base [/font][/color] [color=#000000][font=Consolas] Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork[/font][/color] [color=#000000][font=Consolas] Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)[/font][/color] [color=#000000][font=Consolas] Dim Ds = New MonDataSet 'création de l'objet dataset[/font][/color] [color=#000000][font=Consolas] Dim BS = New BindingSource 'création d'un BindingSource [/font][/color] [color=#000000][font=Consolas] Dim maTA = New MonDataSetTableAdapters.MatableTableAdapter 'Création d'un table adapter [/font][/color] [color=#000000][font=Consolas] maTA.FillByUsernameAndMp(Ds.Matable, username, password) ' Appel de ma requête FillByUsernameAndMp créée auparavant. [/font][/color] [color=#000000][font=Consolas] BS.DataSource = Ds.Matable 'liaison de mon bindingsource[/font][/color] [color=#000000][font=Consolas] If BS.Current Is Nothing Then 'Si mon binding source ne contient aucune valeur malgrés le lancement de la requête filtrée (username et mot de passe), [/font][/color] [color=#000000][font=Consolas] e.Cancel = True 'on arrête le travail du Backgroundwork [/font][/color] [color=#000000][font=Consolas] tt = "ERREUR D'IDENTIFICATION" [/font][/color] [color=#000000][font=Consolas] c = False 'on affecte la valeur "false" à c qu'on récupérera ultérieurement[/font][/color] [color=#000000][font=Consolas] Exit Sub[/font][/color] [color=#000000][font=Consolas] Else[/font][/color] [color=#000000][font=Consolas]'sinon, on affecte la valeur "true"à c qu'on récupérera ultérieurement[/font][/color] [color=#000000][font=Consolas] c = True[/font][/color] [color=#000000][font=Consolas] BackgroundWorker1.Dispose() 'on termine le travail du backgroundWorker[/font][/color] [color=#000000][font=Consolas] End If[/font][/color] [color=#000000][font=Consolas] End Sub[/font][/color] [color=#000000][font=Consolas]' lançons la progressbar en mode asynchrone[/font][/color] [color=#000000][font=Consolas] Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged[/font][/color] [color=#000000][font=Consolas] Me.ProgressBar1.Value = e.ProgressPercentage[/font][/color] [color=#000000][font=Consolas] End Sub[/font][/color] [color=#000000][font=Consolas]' procédure de l'évènement RunWorkerCompleted ( quand le travail est treminé)[/font][/color] [color=#000000][font=Consolas] Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted[/font][/color] [color=#000000][font=Consolas] If c = False Then 'c est la travaille avec la baleur c booléen, ici on n est pas connecté[/font][/color] [color=#000000][font=Consolas] Me.Label1.Text = tt[/font][/color] [color=#000000][font=Consolas] Me.ProgressBar1.Visible = False[/font][/color] [color=#000000][font=Consolas] Exit Sub[/font][/color] [color=#000000][font=Consolas] Else[/font][/color] [color=#000000][font=Consolas] Form1.Show() 'on est connecté on passe à l'autre form[/font][/color] [color=#000000][font=Consolas] Me.Close() [/font][/color] [color=#000000][font=Consolas] End If[/font][/color][/left] Modifié le 13 novembre 2011 par getule erreur 1 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
alirobben Posté(e) le 14 novembre 2011 Share Posté(e) le 14 novembre 2011 Merci pour le code bien commenté Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Rejoindre la conversation
Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.