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 :

background worker et traitement


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut background worker et traitement
    Bonjour bonjour, je me permet de venir vous voir car j'ai un petit soucis, après de nombreux tests sur le background worker je ne comprends pas tout.
    Je m'explique.
    J'ai une fenêtre de connexion à laquelle l'utilisateur se connecte, lorsqu'il clique sur OK, l'application va vérifier la présence de l'utilisateur dans la base, la cohérence des données saisies, ... Cependant, à l'heure actuelle, j'incrémente la progressBar avec un performstep. Mais j'aimerais afficher le pourcentage de l'avancement.
    J'ai essayé quelques options, mais je ne comprends pas ...

    Voici 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
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
     
    Public Class F_Identification
     
    	Private Sub F_Identification_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    		F_Menu.Cursor = Cursors.Default
    		'Mise en place de la fenêtre au centre de F_Menu
    		Me.CenterToParent()
    		CHB_Test.Visible = False
    		CHB_Local.Visible = False
    		If Not File.Exists(My.Settings.EmplacementFichierLog & "log.txt") Then
    			FichierLogErreurs = New StreamWriter(My.Settings.EmplacementFichierLog & "log.txt")
    		Else
    			FichierLogErreurs = File.AppendText(My.Settings.EmplacementFichierLog & "log.txt")
    		End If
    	End Sub
     
    	Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    		OK.Text = "Traitement en cours..."
    		OK.Enabled = False
    		bgwDesign.RunWorkerAsync(CInt(100))
     
    		'Déclarations des variables
    		Dim Nombre As Integer
    		'PB_Chargement.PerformStep()
     
    		'Détermination des identifiants de connexion à la base de données.
    		hostBDD = "localhost"
    		identifiantBDD = "root"
    		passwordBDD = ""
    		NomBDD = "Basetravail"
     
    		If CHB_Test.Checked = True Then
    			hostBDD = "localhost"
    			identifiantBDD = "root"
    			passwordBDD = ""
    			NomBDD = "Basetravail"
     
    		End If
     
    		Cursor = Cursors.WaitCursor
    		Select Case True
    			Case String.IsNullOrEmpty(T_NomUtilisateur.Text)
    				F_Menu.Cursor = Cursors.Default
    				'Pseudo non rempli
    				MsgBox("Merci de saisir un pseudo", MsgBoxStyle.Exclamation)
    				T_NomUtilisateur.Focus()
    				T_NomUtilisateur.SelectAll()
    				PB_Chargement.Value = 0
     
    			Case String.IsNullOrEmpty(T_MDP.Text)
    				F_Menu.Cursor = Cursors.Default
    				'Mot de passe non rempli
    				MsgBox("Merci de saisir un mot de passe", MsgBoxStyle.Exclamation)
    				T_MDP.Focus()
    				T_MDP.SelectAll()
    				PB_Chargement.Value = 0
     
    			Case Else
    				'déclaration des variables de requête
    				Dim reqSelectnb As String
    				Dim dtnb As DataTable
     
    				PseudoSaisi = T_NomUtilisateur.Text
    				reqSelectnb = "select count(*) FROM UTILISATEURS where IdUtilisateur='" & PseudoSaisi & "' "
    				'PB_Chargement.PerformStep()
    				Try
    					dtnb = OrdresSQL.ReqSelection(reqSelectnb)
    					Nombre = dtnb.Rows(0).Item(0).ToString
    					'affectation du nombre dans nb
    				Catch ex As Exception
    					PB_Chargement.Value = 0
    					If ex.Message.Substring(0, 22) = "Access denied for user" Then
    						MessageBox.Show("Merci de revérifier votre pseudo ou votre mot de passe",
    						 "Erreur d'identifiants BDD", MessageBoxButtons.OK, MessageBoxIcon.Information)
    					Else
    						LogErreur(ex.Message, "page : F_Identification", Requete)
    					End If
    				End Try
     
    				If Nombre = 0 Then
    					'En cas d'absence du pseudo dans la base de données.
    					F_Menu.Cursor = Cursors.Default
    					PB_Chargement.Value = 0
    					MsgBox("L'accès a cette application est restreint." &
    					  (Chr(13)) & " Votre pseudo n'existe pas dans la base de données" &
    					  (Chr(13)) & " Pour plus d'informations contacter l'administrateur de l'application.",
    					  MsgBoxStyle.Critical,
    					  "Accès refusé : Pseudo inconnu")
    					T_NomUtilisateur.Focus()
    					T_NomUtilisateur.SelectAll()
     
    				ElseIf Nombre = 1 Then
    					Dim reqSelectMdp As String
    					Dim dtlib As DataTable
    					'PB_Chargement.PerformStep()
    					'sélection du numéro, du mot de passe, et de l'id
    					reqSelectMdp = "select motPasseUtilisateur,numeroUtilisateur,idUtilisateur FROM UTILISATEURS where idUtilisateur='" & PseudoSaisi & "'"
     
    					dtlib = OrdresSQL.ReqSelection(reqSelectMdp)
     
    					'Affectation des données admin dans les variables
    					Password = dtlib.Rows(0).Item(0).ToString
    					NumeroUtilisateur = dtlib.Rows(0).Item(1).ToString
    					Pseudo = dtlib.Rows(0).Item(2).ToString
     
    					If Password <> T_MDP.Text Then
    						'Si le mot de passe saisi est différent de celui présent dans la base
    						F_Menu.Cursor = Cursors.Default
    						'PB_Chargement.Value = 0
    						'Affichage du message d'erreur
    						MsgBox("L'accès a cette application est restreint." &
    						 (Chr(13)) & " Votre mot de passe ne correspond pas avec la base de données" &
    						 (Chr(13)) & " Pour plus d'informations contacter l'administrateur de l'application.",
    						 MsgBoxStyle.Critical,
    						 "Accès refusé : Mot de passe inconnu")
    						T_MDP.Focus()
    						T_MDP.SelectAll()
     
    					Else
    						'Si le password et le pseudo correspondent alors connexion autorisée
     
    						'Avancement de la barre de chargement
    						'PB_Chargement.PerformStep()
    						'chargement des combos du menu
    						ChargerComboMenus()
    						'Préparation de la fenêtre menu
    						With F_Menu
    							.S_Infos.Visible = True
    							.M_Menu.Visible = True
    							.TS_IdUtilisateur.Text = "Bonjour " & Pseudo
    							.TS_Date.Text = "Nous somme le " & Now.Date.ToString("dddd d MMMM yyyy")
    						End With
    						FichierLogErreurs.WriteLine(Now.Date.ToString("dd-MM-yyyy") & " " & Now.Hour & ":" & Now.Minute)
    						FichierLogErreurs.WriteLine(Pseudo & " : Connexion à l'application")
    						Me.Close()
    						F_Menu.Cursor = Cursors.Default
    						If My.Settings.SiretSociété = Nothing Then
    							OuvertureFenêtre(F_Préférences)
    						End If
    					End If
    				End If
    		End Select
    	End Sub
     
    	Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click
    		'Fermeture de l'application
    		Me.Close()
    		Application.Exit()
    	End Sub
     
    	Private Sub T_NomUtilisateur_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_NomUtilisateur.Click
    		SélectionDonnéesChamp(T_NomUtilisateur)
    	End Sub
     
    	Private Sub T_NomUtilisateur_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_NomUtilisateur.Leave
    		If T_NomUtilisateur.Text = "admin" Then
    			CHB_Test.Visible = True
    			CHB_Test.Checked = True
    			CHB_Local.Visible = True
    		End If
     
    	End Sub
     
    	Private Sub T_MDP_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles T_MDP.Click
    		SélectionDonnéesChamp(T_MDP)
    	End Sub
     
     
    	Private Sub bgwDesign_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwDesign.DoWork
    		Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
     
    		e.Result = Treatment(CInt(e.Argument), CInt(e.Argument), worker, e)
    	End Sub
    	Private Function Treatment(ByVal nb As Integer, ByVal max As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Long
     
    		Dim result As Long = 0
     
    		If worker.CancellationPending Then
    			e.Cancel = True
    		Else
    			Dim pourcent As Integer = CInt(((CDec(max) - CDec(nb)) / CDec(max) * 100))
    			worker.ReportProgress(pourcent)
    			If nb <= 1 Then
    				result = 1
    			Else
    				System.Threading.Thread.Sleep(100)
    				result = Treatment(nb - 1, max, worker, e) + 1
    			End If
    		End If
     
    		Return result
    	End Function
     
    	Private Sub bgwDesign_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwDesign.RunWorkerCompleted
    		If Not (e.Error Is Nothing) Then
    			MsgBox("Une erreur est survenue ! Détail : " + e.Error.Message)
    		ElseIf e.Cancelled Then
    			MsgBox("Opération annulée !")
    		Else
    			MsgBox("OK")
    		End If
     
    	End Sub
     
    	Private Sub bgwDesign_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwDesign.ProgressChanged
    		PB_Chargement.Value = e.ProgressPercentage
    	End Sub
    End Class
    Pouvez vous m'aider ?

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    en effet ^^

    le but du backgroundworker c'est de faire des traitement dans le dowork

    moi ce que je vois dans votre code c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub handles button.click
       démarrer le bgw
       faire le traitement
    end sub
     
    sub handles bgw.dowork
       boucle qui incrémente un progressbar doucement
    end sub
    la ligne de code [démarrer le bgw] n'est pas blocante ce qui veut dire que le backgroundworker s'exécute pendant que votre traitement s'exécute sur le thread principal, et le bgw ne fait rien (au mieux rien que ne pourrait faire un simple timer)

    il faut donc déplacer votre code

    quand au pourcentage de progression, si vous avez une boucle, vous pouvez calculer le pourcentage en fonction du tour actuel / tours totaux
    sinon il faut parsemer de reportprogress avec des valeurs arbitaires au plus proche du réel (empirique)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    désolé pour le retard ...
    Citation Envoyé par Pol63 Voir le message
    en effet ^^

    le but du backgroundworker c'est de faire des traitement dans le dowork

    moi ce que je vois dans votre code c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub handles button.click
       démarrer le bgw
       faire le traitement
    end sub
     
    sub handles bgw.dowork
       boucle qui incrémente un progressbar doucement
    end sub
    la ligne de code [démarrer le bgw] n'est pas blocante ce qui veut dire que le backgroundworker s'exécute pendant que votre traitement s'exécute sur le thread principal, et le bgw ne fait rien (au mieux rien que ne pourrait faire un simple timer)

    il faut donc déplacer votre code

    quand au pourcentage de progression, si vous avez une boucle, vous pouvez calculer le pourcentage en fonction du tour actuel / tours totaux
    sinon il faut parsemer de reportprogress avec des valeurs arbitaires au plus proche du réel (empirique)
    donc si j'ai bien compris votre réponse, cela devrait donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub handles button.click
       démarrer le bgw
    end sub
     
    sub handles bgw.dowork
       boucle qui incrémente un progressbar doucement
       faire le traitement
    end sub

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    oui

    par contre dans le backgroundworker.dowork vous êtes sur un autre thread, il est donc impossible de modifier l'interface (les controles)
    si nécessaire il faut passer par l'event reportprogress (je crois qu'on peut passer un objet) ou alors faire me.invoke
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Citation Envoyé par planeurbret Voir le message

    donc si j'ai bien compris votre réponse, cela devrait donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    sub handles button.click
       démarrer le bgw
    end sub
     
    sub handles bgw.dowork
       boucle qui incrémente un progressbar doucement
       faire le traitement
    end sub
    Presque. Le doWork est exécuté dans un autre Thread. Il ne faut donc pas incrémenté le progressbar à ce niveau. Le BackgroundWorker propose une méthode pour effectuer ce genre de chose. Pour reprendre votre exemple, cela donnerait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub handles button.click
       démarrer le bgw
    end sub
     
    sub handles bgw.dowork
          faire le traitement
          bgw.ReportProgress(Pourcent)
    end sub
     
    ' Code exécuté dans le thread principal :
    sub handles bgw.ProgressChanged(Pourcent)
      update un progressbar à Pourcent%
    end sub
    Concernant le ReportProgress, je ne peux que citer Pol63 :
    quand au pourcentage de progression, si vous avez une boucle, vous pouvez calculer le pourcentage en fonction du tour actuel / tours totaux
    sinon il faut parsemer de reportprogress avec des valeurs arbitaires au plus proche du réel (empirique)
    Pour plus d'infos sur le BackgroundWorker : Msdn

    eb.

  6. #6
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    Voici une source exemple que j'ai écrite (certe en C# WPF) mais qui donne un exemple d'une barre de progression avec le BackGroundWorker
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  7. #7
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    Merci pour votre aide, je vais essayer sa ce soir en rentrant. Merci encore !!

  8. #8
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub handles button.click
       démarrer le bgw
    end sub
     
    sub handles bgw.dowork
          faire le traitement
          bgw.ReportProgress(Pourcent)
    end sub
     
    ' Code exécuté dans le thread principal :
    sub handles bgw.ProgressChanged(Pourcent)
      update un progressbar à Pourcent%
    end sub
    J'ai respecté cette cinématique et en fait, le traitement ne se fait qu'a la fin de la barre de chargement ...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Il faudrait voir le code du bgw.doWork pour pouvoir répondre...
    eb.

  10. #10
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
     
    Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    		OK.Text = "Traitement en cours..."
    		OK.Enabled = False
    		Cursor = Cursors.WaitCursor
    		bgwDesign.RunWorkerAsync(CInt(200))
     
     
    End Sub
     
    Private Sub bgwDesign_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwDesign.DoWork
    		Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
     
    		e.Result = Treatment(CInt(e.Argument), CInt(e.Argument), worker, e)
    		'Déclarations des variables
    		Dim Nombre As Integer
    		'PB_Chargement.PerformStep()
     
    		'Détermination des identifiants de connexion à la base de données.
     
    		If CHB_Test.Checked = True Then
    			hostBDD = "localhost"
    			identifiantBDD = "root"
    			passwordBDD = ""
    			NomBDD = "BretagnePyro"
     
    		End If
     
     
    		Select Case True
    			Case String.IsNullOrEmpty(T_NomUtilisateur.Text)
    				bgwDesign.Dispose()
    				F_Menu.Cursor = Cursors.Default
    				'Pseudo non rempli
    				MsgBox("Merci de saisir un pseudo", MsgBoxStyle.Exclamation)
    				T_NomUtilisateur.Focus()
    				T_NomUtilisateur.SelectAll()
    				PB_Chargement.Value = 0
     
    			Case String.IsNullOrEmpty(T_MDP.Text)
    				F_Menu.Cursor = Cursors.Default
    				'Mot de passe non rempli
    				MsgBox("Merci de saisir un mot de passe", MsgBoxStyle.Exclamation)
    				T_MDP.Focus()
    				T_MDP.SelectAll()
    				PB_Chargement.Value = 0
     
    			Case Else
    				'déclaration des variables de requête
    				Dim reqSelectnb As String
    				Dim dtnb As DataTable
     
    				PseudoSaisi = T_NomUtilisateur.Text
    				reqSelectnb = "select count(*) FROM UTILISATEURS where IdUtilisateur='" & PseudoSaisi & "' "
    				'PB_Chargement.PerformStep()
    				Try
    					dtnb = OrdresSQL.ReqSelection(reqSelectnb)
    					Nombre = dtnb.Rows(0).Item(0).ToString
    					'affectation du nombre dans nb
    				Catch ex As Exception
    					PB_Chargement.Value = 0
    					If ex.Message.Substring(0, 22) = "Access denied for user" Then
    						MessageBox.Show("Merci de revérifier votre pseudo ou votre mot de passe",
    						 "Erreur d'identifiants BDD", MessageBoxButtons.OK, MessageBoxIcon.Information)
    					Else
    						LogErreur(ex.Message, "page : F_Identification", Requete)
    					End If
    				End Try
     
    				If Nombre = 0 Then
    					'En cas d'absence du pseudo dans la base de données.
    					F_Menu.Cursor = Cursors.Default
    					PB_Chargement.Value = 0
    					MsgBox("L'accès a cette application est restreint." &
    					  (Chr(13)) & " Votre pseudo n'existe pas dans la base de données" &
    					  (Chr(13)) & " Pour plus d'informations contacter l'administrateur de l'application.",
    					  MsgBoxStyle.Critical,
    					  "Accès refusé : Pseudo inconnu")
    					T_NomUtilisateur.Focus()
    					T_NomUtilisateur.SelectAll()
     
    				ElseIf Nombre = 1 Then
    					Dim reqSelectMdp As String
    					Dim dtlib As DataTable
     
    					'sélection du numéro, du mot de passe, et de l'id
    					reqSelectMdp = "select motPasseUtilisateur,numeroUtilisateur,idUtilisateur FROM UTILISATEURS where idUtilisateur='" & PseudoSaisi & "'"
     
    					dtlib = OrdresSQL.ReqSelection(reqSelectMdp)
     
    					'Affectation des données admin dans les variables
    					Password = dtlib.Rows(0).Item(0).ToString
    					NumeroUtilisateur = dtlib.Rows(0).Item(1).ToString
    					Pseudo = dtlib.Rows(0).Item(2).ToString
     
    					If Password <> T_MDP.Text Then
    						'Si le mot de passe saisi est différent de celui présent dans la base
    						F_Menu.Cursor = Cursors.Default
     
    						'Affichage du message d'erreur
    						MsgBox("L'accès a cette application est restreint." &
    						 (Chr(13)) & " Votre mot de passe ne correspond pas avec la base de données" &
    						 (Chr(13)) & " Pour plus d'informations contacter l'administrateur de l'application.",
    						 MsgBoxStyle.Critical,
    						 "Accès refusé : Mot de passe inconnu")
    						T_MDP.Focus()
    						T_MDP.SelectAll()
     
    					Else
    						ChargerComboMenus()
    					End If
    				End If
    		End Select
    	End Sub
    	Private Function Treatment(ByVal nb As Integer, ByVal max As Integer, ByVal worker As BackgroundWorker, ByVal e As DoWorkEventArgs) As Long
     
    		Dim result As Long = 0
     
    		If worker.CancellationPending Then
    			e.Cancel = True
    		Else
    			Dim pourcent As Integer = CInt(((CDec(max) - CDec(nb)) / CDec(max) * 100))
    			worker.ReportProgress(pourcent)
    			If nb <= 1 Then
    				result = 1
    			Else
    				System.Threading.Thread.Sleep(50)
    				result = Treatment(nb - 1, max, worker, e) + 1
    			End If
    		End If
     
    		Return result
    	End Function
     
    	Private Sub bgwDesign_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwDesign.RunWorkerCompleted
    		If Not (e.Error Is Nothing) Then
    			MsgBox("Une erreur est survenue ! Détail : " + e.Error.Message)
    		ElseIf e.Cancelled Then
    			MsgBox("Opération annulée !")
    		Else
    			Me.Close()
    			'Si le password et le pseudo correspondent alors connexion autorisée
     
     
    			'chargement des combos du menu
     
    			'Préparation de la fenêtre menu
    			With F_Menu
    				.S_Infos.Visible = True
    				.M_Menu.Visible = True
    				.TS_IdUtilisateur.Text = "Bonjour " & Pseudo
    				.TS_Date.Text = "Nous somme le " & Now.Date.ToString("dddd d MMMM yyyy")
    			End With
    			FichierLogErreurs.WriteLine(Now.Date.ToString("dd-MM-yyyy") & " " & Now.Hour & ":" & Now.Minute)
    			FichierLogErreurs.WriteLine(Pseudo & " : Connexion à l'application")
    			'Me.Close()
    			'F_Menu.Cursor = Cursors.Default
    			If My.Settings.SiretSociété = Nothing Then
    				OuvertureFenêtre(F_Préférences)
    			End If
    		End If
     
    	End Sub
     
    	Private Sub bgwDesign_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgwDesign.ProgressChanged
    		PB_Chargement.Value = e.ProgressPercentage
    	End Sub
    End Class

  11. #11
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Un problème évident au vu du code est que l'UI est modifiée depuis le worker thread. Ces appels devraient lever une exception. L'UI ne peut être modifiée que par le thread principal. Le worker thread doit donc reporter ces opérations de mise à jour de l'UI sur le thread principal via Control.Invoke (WinForms) ou Dispatcher.JeSaisPlus (WPF)

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    C'est normal :Au démarrage du BackgroundWorker, tu appelles Treatment pour mettre à jour la progressbar et cette fonction est récurcive ... Elle arrête de s'appeler elle-même lorsque la progressbar est à 100%. Ensuite le traitement commence...
    De plus, un BackgroundWorker (plus généralement, un thread secondaire) permet d'effectuer un traitement long en tache de fond sans figer l'ihm.
    Je ne suis pas certain que ce soit vraiment utile ici. J'ai lu en diagonale mais si j'ai bien compris le principe, il s'agit d'une vérification de connexion utilisateur. Le temps de cette vérification, l'utilisateur n'aura a priori pas l'autorisation d'effectuer des actions. Il devra attendre le retour pour continuer non ? Donc, le thread séparé est superflue. Une simple méthode avec les vérifications et éventuellement la progressbar mise à jour régulièrement entre 2 fera l'affaire je pense.

    Enfin, qui dit Thread séparé dit traitement en tache de fond. Donc les MsgBox ne doivent pas être codés à ce niveau. Si une erreur est détectée au cours du thread, on stocke le message dans un objet quelconque et on sort du thread. On affiche le message après !
    Bon courage.
    eb.

  13. #13
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    En fait ce que je voulais faire c'est de pouvoir voir l'affichage du poucentage en cours. Parce que vaant j'avais mis un perform step, mais cela ne représentait rien, elle s'incrémentait block par block.
    Je ne sais pas trop comment faire du coup ...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    L'avancement d'une progressbar doit être synchronisé avec l'avancement d'un traitement. Si le traitement présente 3 étapes, il sera difficile d'avoir une progressbar avec un avancement de 0 à 100 fluide.
    La progressbar présente un intérêt pour un traitement long, cela fait patienter l'utilisateur. Est-ce que la vérification d'un login utilisateur est un traitement long ?
    De plus, en regardant de plus près le code, il y a deux requêtes sur la table utilisateur, une fois avec le login seule et la seconde qui retourne le password pour test. C'est pas optimum. Une seule requête avec le login et le password en clause where me semble préférable (pour des raisons de sécurité, l'utilisateur n'a pas besoin de savoir si l'erreur provient du login ou du mot de passe).
    Enfin, la concaténation de chaine pour la clause where est à proscrire ! Il est la porte ouverte à de l'injection SQL (L'utilisateur peut saisir du code SQL dans son login). Il faut privilégier les requêtes paramétrées.
    eb.

  15. #15
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par ebastien Voir le message
    La progressbar présente un intérêt pour un traitement long, cela fait patienter l'utilisateur. Est-ce que la vérification d'un login utilisateur est un traitement long ?
    Dans certains cas, oui : réseau médiocre (en général ou exceptionnellement), problème serveur, etc. Si l'on n'utilise pas un thread séparé l'application donnera l'air de ne plus répondre pendant ce temps, donnant l'illusion d'un plantage. Ajoute à cela l'incapacité de répondre rapidement à des sollicitations du système, comme en cas de fermeture de l'OS, ce qui serait ennuyeux si l'appli est supposée sauvegarder des données à ce moment.

    Or réaliser une tâche de ce genre en traitement de fond est relativement trivial une fois que l'on connaît. Il ne connaît pas encore mais il faut bien apprendre un jour.

  16. #16
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    Merci pour vos réponses

  17. #17
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Dans certains cas, oui : réseau médiocre (en général ou exceptionnellement), problème serveur, etc. Si l'on n'utilise pas un thread séparé l'application donnera l'air de ne plus répondre pendant ce temps, donnant l'illusion d'un plantage. Ajoute à cela l'incapacité de répondre rapidement à des sollicitations du système, comme en cas de fermeture de l'OS, ce qui serait ennuyeux si l'appli est supposée sauvegarder des données à ce moment.
    Oui je suis d'accord sur le fond. Toutefois, dans une application de gestion, si on commence à multi-threader une petite requête sql qui va rechercher le user dans la base, alors, la logique voudrait qu'on multi-thread toutes les requêtes effectuées par l'appli... Dans la pratique, je ne l'ai jamais vu.

    Or réaliser une tâche de ce genre en traitement de fond est relativement trivial une fois que l'on connaît. Il ne connaît pas encore mais il faut bien apprendre un jour.
    100% d'accord !!

  18. #18
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    Mais du coup, si je veux faire un traitement en tache de fond, comment faut faire pour que la barre de chargement avance en fonction de l'avancement du traitement. Parce que je me suis un peu perdu en fait ...

  19. #19
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Citation Envoyé par planeurbret Voir le message
    Mais du coup, si je veux faire un traitement en tache de fond, comment faut faire pour que la barre de chargement avance en fonction de l'avancement du traitement. Parce que je me suis un peu perdu en fait ...
    L'approche suivie jusqu'ici est la bonne, il suffit de corriger les problèmes.

    Or je l'ai déjà mentionné, tu manipules l'UI depuis le thread de travail, ce qui lève une exception. Petit bémol à ce que j'ai dit plus haut : le BackgroundWorker s'occupe de lever ses événements sur le thread UI, donc inutile que tu t'embêtes avec Control.Invoke. Il suffit que tu déportes ton code de maj de l'UI (celui après Treatment) dans BackgroundWorker.RunWorkerCompleted. Cf. l'exemple sur la page msdn liée plus haut (le problème y est d'ailleurs expliqué).

    Enfin vérifie aussi les propriétés de ton BackgroundWorker pour s'assurer que les événements sont levés, voir à nouveau l'exemple sur la page MSDN.

    Citation Envoyé par ebastien Voir le message
    Toutefois, dans une application de gestion, si on commence à multi-threader une petite requête sql qui va rechercher le user dans la base, alors, la logique voudrait qu'on multi-thread toutes les requêtes effectuées par l'appli...
    Effectivement, pour une telle appli ça se discute. Petit bémol : j'ai vu dans le passé sur certains systèmes avec DB locale des temps de connexion assez longuets (temps de chargement du service ?).

  20. #20
    Membre régulier
    Homme Profil pro
    apprenti
    Inscrit en
    Décembre 2011
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2011
    Messages : 212
    Points : 100
    Points
    100
    Par défaut
    Après avoir eu un rendez vous avec la personne pour laquelle je travaille, nous avons donc décidé de supprimer la fenêtre d'identification et de la remplacer par un splashscreen avec une barre de chargement (plusieurs combos menus à charger avant que l'appli soit disponible). Et du coup, je voudrais toujours rester sur cette idée de barre de chargement, si j'ai bien compris le meilleur serais de le faire par performstep() ?
    Mais je voudrais rajouter un pourcentage comme certains chargement d'appli ou on voit le pourcentage de chargement qu'il reste ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. BackGround Worker argument
    Par Thesum dans le forum VB.NET
    Réponses: 1
    Dernier message: 05/12/2008, 13h28
  2. Background Worker / Problème affichage image de progression
    Par Saten dans le forum Windows Forms
    Réponses: 12
    Dernier message: 02/12/2008, 13h32
  3. Gérer les exceptions d'un Background worker
    Par Nixar dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/08/2008, 22h31
  4. Connexion LDAP et Background worker
    Par javaboy dans le forum VB.NET
    Réponses: 2
    Dernier message: 21/05/2008, 09h17
  5. arret Background worker thread
    Par ricky78 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/02/2007, 12h15

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