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

  1. #1
    Membre habitué
    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
    Points : 151
    Points
    151
    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
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    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 habitué
    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
    Points : 151
    Points
    151
    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 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 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
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    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 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 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é.

  7. #7
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Tu as raison, moi non plus je ne suis pas d'accord avec moi. J'avais lu le code un peu vite ... Désolé.
    Pas de soucis, il m'arrive également de survoler rapidement les topics ....

  8. #8
    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
    si, dans le principe ebastien a raison, enfin dans le principe de bon codage

    le fait qu'instancier un form fasse du code spécifique à ce point n'est pas génial
    de plus en cas d'erreur de get des données on a instancié un form pour rien (certes je chipote ^^)

    norlament il faudrait rappatrier les données dans le bgw puis en les faire transiter en completed qui lui instancie form2 en lui donnant les données


    dans le pire des cas faire un new form2 en lui donnant le mois et que le form2 fasse un bgw en disant d'attendre


    et de toute facon que form1 modifie les controles de form2 pour le charger c'est pas terrible
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si, dans le principe ebastien a raison, enfin dans le principe de bon codage

    le fait qu'instancier un form fasse du code spécifique à ce point n'est pas génial
    de plus en cas d'erreur de get des données on a instancié un form pour rien (certes je chipote ^^)

    norlament il faudrait rappatrier les données dans le bgw puis en les faire transiter en completed qui lui instancie form2 en lui donnant les données


    dans le pire des cas faire un new form2 en lui donnant le mois et que le form2 fasse un bgw en disant d'attendre


    et de toute facon que form1 modifie les controles de form2 pour le charger c'est pas terrible

    Je suis tout à fait d'accord et c'est en ce sens que j'ai dis que ce n'était pas la meilleure des solutions la bidouille que j'ai proposé ou du moins que je n'aurai pas fais comme ça

    Mais étant donné que abd75web n'arrive déjà pas à implémenter un simple backgroundWorker en séparant bien l'UI du main thread alors je me vois mal lui expliquer qu'il faille placer son bgw dans son Form2 et l'appeler depuis son form1 afin de mettre à jour ses contrôles du Form2 directement.

    J'attends s'il le souhaite qu'il me transmette son projet par MP ainsi je posterai la solution au final avec le code de son 1er topic pour faire quelque lumière aux futurs membres s'ils rencontrent le même pb.


    A+

  10. #10
    Membre habitué
    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
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    J'attends s'il le souhaite qu'il me transmette son projet par MP ainsi je posterai la solution au final avec le code de son 1er topic pour faire quelque lumière aux futurs membres s'ils rencontrent le même pb.
    Désolé pour le retard de ma répense

    Veuillez trouver la partie qui concerne notre sujet dans mon projet
    Merci ....
    Fichiers attachés Fichiers attachés

  11. #11
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par abd75web Voir le message
    Désolé pour le retard de ma répense

    Veuillez trouver la partie qui concerne notre sujet dans mon projet
    Merci ....
    désolé.... mais.....ce projet c'est une vraie usine à gaz.......o_O

    Je vais regarder ca.


    EDIT : bon très bien nous allons procéder par ordre :

    1- Ton formulaire FrmInformation est complètement bordélique donc au lieu de générer son contenu dynamiquement créé un autre form qui se nomme FrmInfos et sur lequel tu glisses tes contrôles pour lui donner cette apparence :

    http://imabox.fr/a3/1415062228i8R6t109.png

    Et s'il te plait ta combobox paramètres -la comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cbx.DropDownStyle = ComboBoxStyle.DropDownList
    Ca évitera que l'utilisateur ne saisisses d'autres valeur que celle prévues et au pire de faire des testes pour vérifier si c'est une valeur valide !

    Enfin tu peux cliquer-droit sur ton ancien form FrmInformations et sélectionner exclure du projet.

    Renvoie-moi la MAJ


    A+

  12. #12
    Membre habitué
    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
    Points : 151
    Points
    151
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    1- Ton formulaire FrmInformation est complètement bordélique donc au lieu de générer son contenu dynamiquement créé un autre form qui se nomme FrmInfos et sur lequel tu glisses tes contrôles pour lui donner cette apparence :
    http://imabox.fr/a3/1415062228i8R6t109.png
    j'ai développé "FrmInformation" de cette manière par ce qu'elle est appelée plus de 35 fois dans mon projet
    -Pour éditer la balance, éditer des états de chiffres d'affaires, état des pieces et autres ...
    c'est pour cela j'ai créé le formulaire "FrmInformation" Vide et je le remplis dynamiquement

    Citation Envoyé par wallace1 Voir le message
    Enfin tu peux cliquer-droit sur ton ancien form FrmInformations et sélectionner exclure du projet.
    malheursement je ne peu pas l'exclure de mon projet

    Es ce que si possible de garder cette impléméntation?

  13. #13
    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 abd75web Voir le message
    j'ai développé "FrmInformation" de cette manière par ce qu'elle est appelée plus de 35 fois dans mon projet
    -Pour éditer la balance, éditer des états de chiffres d'affaires, état des pieces et autres ...
    c'est pour cela j'ai créé le formulaire "FrmInformation" Vide et je le remplis dynamiquement
    Je ne connais pas tous les tenants et aboutissants de ce projet mais gérer le contenu d'une Form dynamiquement afin qu'elle s'adapte à 35 contextes différents, je pense que ça va devenir très vite inmaintenable. Il serait sûrement préférable de faire une Form de base contenant les parties communes à tous les contextes et de faire de l'héritage de cette Form pour gérer le spécifique à chaque contexte.

  14. #14
    Expert confirmé
    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
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bonjour,


    Je ne connais pas tous les tenants et aboutissants de ce projet mais gérer le contenu d'une Form dynamiquement afin qu'elle s'adapte à 35 contextes différents, je pense que ça va devenir très vite inmaintenable. Il serait sûrement préférable de faire une Form de base contenant les parties communes à tous les contextes et de faire de l'héritage de cette Form pour gérer le spécifique à chaque contexte.
    Je plussois, c'est exactement la ou je voulais en venir en procédant par étape.

    Mais je crains qu'au vue du contenu du projet, certaine notion de la POO lui soit complétement abstraites.....

    Citation Envoyé par abd75web Voir le message

    Es ce que si possible de garder cette impléméntation?
    Comme mentionné par ebastien, tu crees un forminfos avec les controles communs .....et ensuite tu herites en ajoutant les autres controles specifiques. Je te fais un exemple ce soir pour te montrer....(arfff j'aurais pas forcément le temps....... à voir....)

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