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 :

BackgroundWorker pour un Progress Bar et les contrôls d'une autre form


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut BackgroundWorker pour un Progress Bar et les contrôls d'une autre form
    Bonjour,

    C'est la premère fois que je veux utiliser le composant BackgroundWorker

    La situation est la suivante :

    j'ai une form1 que je doit choisir un mois et je clique sur le boton Ok -> un traitement se fait (l'execution d'un procédure stockée qui peu durée jusqu'a 10 second) avec une ProgressBar puis -> Afficher le resultat dans un datagridview d'une autre form2

    et mon code est :

    pour le Bouton "OK"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub BtOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtOk.Click
     
                                backgroundWorker1 = New BackgroundWorker
                                backgroundWorker1.WorkerReportsProgress = True
                                backgroundWorker1.WorkerSupportsCancellation = True
                                backgroundWorker1.RunWorkerAsync()
    End Sub
    Et pour le DoWork

    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
    Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
     
     
            Dim Frm As New Form2
     
            With Frm
                .DataGListe.DataSource = .BindingSourceListe
                Try
                    TableListe = New DataTable
                    Cmd = New SqlCommand("Compta.P_Balance_Generale", Connexion)
                    Cmd.CommandType = CommandType.StoredProcedure
                    .SqlDAListe = New SqlDataAdapter(Cmd)
                    .SqlDAListe.Fill(TableListe)
                    .BindingSourceListe.DataSource = TableListe
                    .LbNbr.Text = TableListe.Rows.Count
    ......
     
                    .DataGListe.Rows(0).DefaultCellStyle.Font = New Font(Control.DefaultFont, FontStyle.Bold)
                    For Each Colonne As DataGridViewColumn In .DataGListe.Columns
                        Colonne.SortMode = DataGridViewColumnSortMode.NotSortable
                    Next
     
                Catch ex As Exception
     
                End Try
     
                .Show()
            End With
     
            Dim nbr As Integer = 400
            Dim compteur As Integer = 0
     
            Dim delegateIncrement As dIncrement = AddressOf Increment
     
            Do
                compteur = delegateIncrement(compteur)
                backgroundWorker1.ReportProgress((compteur * 100) / nbr) 
                If Me.backgroundWorker1.CancellationPending = True Then
                    e.Result = compteur
                    Exit Do
                End If
            Loop Until compteur = nbr
     
            e.Result = compteur
     
        End Sub
    Et dans le load du Form2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
    Dim TextBox1 As TextBox
    Dim TextBox2 As TextBox
     
     
    End Sub
    mais j'ai le problème que Form2 se plante

    et si je mets en commentaire

    La ProgressBar Progresse normal

    Merci de m'eclairer ce problème

  2. #2
    Membre Expert
    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
    Billets dans le blog
    7
    Par défaut
    Bonjour abd75web,

    Dans un thread il n'est pas possible de mettre à jour la partie UI d'un programme, il faut utiliser les délégués ou dans ton cas (le backgroundWorker) il faut que tu sortes du_ gestionnaire d'évènement "Dowork" en appelant "ReportProgress"
    Ça pourrait ressembler à 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
    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
     
    Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
     
     
            Dim Frm As New Form2
     
            With Frm
                .DataGListe.DataSource = .BindingSourceListe
                Try
                    TableListe = New DataTable
                    Cmd = New SqlCommand("Compta.P_Balance_Generale", Connexion)
                    Cmd.CommandType = CommandType.StoredProcedure
                    .SqlDAListe = New SqlDataAdapter(Cmd)
                    .SqlDAListe.Fill(TableListe)
                    .BindingSourceListe.DataSource = TableListe
                    .LbNbr.Text = TableListe.Rows.Count
    ......
     
                    .DataGListe.Rows(0).DefaultCellStyle.Font = New Font(Control.DefaultFont, FontStyle.Bold)
                    For Each Colonne As DataGridViewColumn In .DataGListe.Columns
                        Colonne.SortMode = DataGridViewColumnSortMode.NotSortable
                    Next
     
                Catch ex As Exception
                    Msgbox(ex.tostring)
                End Try
            End With
     
            BgwConnect.ReportProgress(1, Frm)
     
            Dim nbr As Integer = 400
            Dim compteur As Integer = 0
     
            Dim delegateIncrement As dIncrement = AddressOf Increment
     
            Do
                compteur = delegateIncrement(compteur)
                backgroundWorker1.ReportProgress((compteur * 100) / nbr) 
                If Me.backgroundWorker1.CancellationPending = True Then
                    e.Result = compteur
                    Exit Do
                End If
            Loop Until compteur = nbr
     
            e.Result = compteur
     
        End Sub
     
     Private Sub backgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles backgroundWorker1.ProgressChanged
            If e.ProgressPercentage = 1 Then
                TryCast(e.UserState, Form2).ShowDialog()
            End If
        End Sub
    ATTENTION : JE NE DIS PAS QUE C'EST LA MEILLEURE SOLUTION CAR PERSONNELLEMENT JE N'AURAIS PAS IMPLEMENTE LE CODE AINSI : PROGRESSBAR ET MAJ UI

    PS : Tu peux glisser le composant BackgroundWorker depuis la boite à outils sur ton form1 et le paramétrer depuis les propriétés au lieu de le faire directement dans ta sub "BtOk_Click".

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2012
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 175
    Par défaut
    Bonjour; Merci pour la répense

    j'ai apporté tes propositions mais le problème persiste

    et j'ai l'erreur suivante :

    "Une exception a été levée par la cible d'un appel."
    et pour

    Citation Envoyé par wallace1 Voir le message
    ATTENTION : JE NE DIS PAS QUE C'EST LA MEILLEURE SOLUTION CAR PERSONNELLEMENT JE N'AURAIS PAS IMPLEMENTE LE CODE AINSI : PROGRESSBAR ET MAJ UI
    ".
    Es ce qu'il a y une autre implementation, juste pour éviter ce genre de problème à la venir

    Merci encore

  4. #4
    Membre Expert
    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
    Par défaut
    Bonjour,
    Il serait préférable d'instancier Form2 au niveau l'event BackgroundWorker.RunWorkerCompleted ... (et de lui donner aussi un autre nom que Form2)

  5. #5
    Membre Expert
    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
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bonjour,
    Il serait préférable d'instancier Form2 au niveau l'event BackgroundWorker.RunWorkerCompleted ... (et de lui donner aussi un autre nom que Form2)
    Je ne suis pas d'accords avec toi ebastien. Je m'explique :

    S'il instancie son Form2 au niveau de BackgroundWorker.RunWorkerCompleted alors toute sa tache de calcul s'en suivra dans le corps de cette même sub donc la notion de thread n'a pas lieu d'être car le calcul long se situe à la fin du thread Async (backgroundWorker1_DoWork + backgroundWorker1_ProgressChanged) !


    @abd75web :

    Malheureusement je ne maîtrise pas l'intégralité de ton projet ce qui fausse je pense la résolution de ton problème. Envoye moi ton projet par MP que je t'explique en commentant comment cela doit être implémenter.

    A+

  6. #6
    Membre Expert
    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
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Je ne suis pas d'accords avec toi ebastien
    Tu as raison, moi non plus je ne suis pas d'accord avec moi. J'avais lu le code un peu vite ... Désolé.

Discussions similaires

  1. Utiliser les controles d'une autre form
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/10/2010, 18h34
  2. [XL-2007] CheckBox ou Listbox pour sélectionner des critères et les afficher dans une autre feuille
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 19/08/2009, 15h19
  3. Accéder aux contrôle d'une autre Form
    Par Auriga1 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 12/02/2009, 15h45
  4. Réponses: 10
    Dernier message: 22/08/2007, 18h07
  5. [C#] Modifier Propriété d'un contrôle d'une autre Form
    Par sara21 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/09/2006, 20h41

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