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

Windows Forms Discussion :

[VB.net] backgroundworker targetexception


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut [VB.net] backgroundworker targetexception
    Bonjour,
    Voila j'ai une application en vb.net qui fonctionne tres bien sans backgroundworker sauf sur le traitement final qui est tres gourmand et j'ai donc un gros freeze de l'interface.
    Je me suis donc tourné vers le backgroundworker mais j'ai quelques difficultés.
    J'ai fait mon code grâce a un tuto du site, mon code ressemble bien a celui proposé comme exemple mais j'ai quand meme l'erreur suivante lors de l'execution du traitement :
    TargetInvocationException was unhandled
    Une exception a été levée par la cible d'un appel.
    Et pour voila le code qui declare le backgroundworker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
           public bgw as BackgroundWorker
     bgw = New BackgroundWorker
            bgw.WorkerReportsProgress = True
            bgw.WorkerSupportsCancellation = True
            AddHandler bgw.DoWork, AddressOf bgw_DoWork
            AddHandler bgw.RunWorkerCompleted, AddressOf bgw_RunWorkerCompleted
            AddHandler bgw.ProgressChanged, AddressOf bgw_ProgressChanged
    Et les methodes
    DoWork
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
            rapp_pdf.Visible = True
            rapp_pdf.Enabled = True
            Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
            creation_rapport(worker, e)
        End Sub
    ProcessChanged
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles bgw.ProgressChanged
            rapp_pdf.pgb_rapport.Value = e.ProgressPercentage
        End Sub
    et RunWorkerCompleted
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
            rapp_pdf.Visible = False
            rapp_pdf.pgb_rapport.Value = 0
            If rapport Then
                MsgBox("Le rapport a bien été créé.", , "Félicitation") 'affiche si la creation a bien été effectuée
                Me.Focus()
            Else
                MsgBox("Il y a eu un problème lors de la création du rapport, veuillez réessayer.", MsgBoxStyle.Exclamation & MsgBoxStyle.OkOnly, "/!\ Attention /!\")
                btnrapport.Visible = True
                btnrapport.Focus()
            End If
            bgw.CancelAsync()
        End Sub
    et un extrait de creation_rapport() (qui fonctionne tres bien sans backgroundworker a part le petit freeze)
    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
    'chemin du fichier
                    appXls.Workbooks.Open(cheminautre & ".xls") 'ouverture du fichier excel
                    sheetXls = appXls.ActiveWorkbook.Worksheets("Rapport")
                    'valorisation des cellules
                    worker.ReportProgress(10)
                    With sheetXls
                        .Range("P2").Value = txtdossier.Text
                        .Range("P3").Value = txtmission.Text
                        .Range("F6").Value = txtrapportautre.Text
                        .Range("D15").Value = txtdepartement.Text
                        .Range("C16").Value = txtcommune.Text
                        .Range("C17").Value = txtadresse.Text
                        .Range("B22").Value = txtlotautre.Text
                        .Range("C20").Value = txtlocaautre.Text
                        .Range("I20").Value = txtapptautre.Text
                        .Range("I21").Value = txtnivautre.Text
                        .Range("E23").Value = txtconstrautre.Text
                        .Range("E24").Value = txtinstalautre.Text
                        .Range("E26").Value = txtvisiteautre.Text
                        .Range("A270").Value = txtautreconst.Text
                        .Range("D29").Value = txttechnicien.Text
                        .Range("A273").Value = txtautreconst.Text
                        'controle de l'alimentation via la checkbox du formulaire
                        worker.ReportProgress(25)
                        bdd_xls_pdf(chkalimautre.Checked)
                        'controle de la presence de constatations dans le formulaire
                        If txtautreconst.Text = "" Or txtautreconst.Text = "Aucune" Then
                            .Range("A76").Value = non
                            .Range("A44").Value = non
                        Else
                            .Range("A76").Value = oui
                            .Range("A44").Value = oui
                        End If
                        'affichage des anomalies detectées par l'agent
                        worker.ReportProgress(60)
                        show_ano()
                        'affichage des pieces non visitées et raison
                        worker.ReportProgress(85)
                        show_impossibilite()
                    End With
                    acr = New ACRODISTXLib.PdfDistiller
                    'appel de la methode impression_pdf et attribution du chemin du fichier sans son extension 
                    worker.ReportProgress(100)
                    impression_pdf(cheminautre)
    Et j'ai failli oublier de vous dire que l'erreur n'indique aucune ligne dans mon code mais qu'elle survient lors de l'appel de creation_rapport()

    mise a jour : au vue des tests que j'effectue j'ai trouvé que l'erreur etait au niveau du passage de parametre pour la progressbarre.

    Dans l'attente de vos reponses
    Cordialement
    Nasty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    L'interface graphique ne doit être modifiée que dans le thread principal. Le code de DoWork s'exécute dans un thread séparé, donc il ne faut pas toucher à l'interface dans cet évènement. Si tu as besoin de transmettre quelque chose au thread principal pour mettre à jour l'interface, tu peux utiliser la méthode ReportProgress, qui déclenche l'évènement ProgressChanged sur le thread principal. Tu peux aussi invoquer une méthode sur le thread principal avec la méhode Invoke :


    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
        Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
            ' Pas possible car on n'est pas le thread principal
            'rapp_pdf.Visible = True
            'rapp_pdf.Enabled = True
     
            ' Exécute AfficherRapportPdf sur le thread principal
            Me.Invoke(New MethodInvoker(AddressOf AfficherRapportPdf))
     
            Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
            creation_rapport(worker, e)
        End Sub
     
    Private Sub AfficherRapportPdf()
            rapp_pdf.Visible = True
            rapp_pdf.Enabled = True
    End Sub

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut
    Merci de ta réponse.
    Je tiens a precisez que le rapp_pdf n'est pas mon thread principal mais juste un formulaire a part pour afficher la progressbarre.
    Cordialement
    Nasty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par nasty Voir le message
    Je tiens a precisez que le rapp_pdf n'est pas mon thread principal mais juste un formulaire a part pour afficher la progressbarre.
    Ben non, ça risque pas "d'être le thread principal", vu que c'est pas un thread du tout

    Quand je parle du "thread principal", ça veut dire le thread de l'interface graphique, celui qui exécute la boucle de messages windows. Si ton rapp_pdf fait partie de l'interface graphique, il s'exécute forcément dans le thread principal (à moins que tu aies lancé une autre boucle de message dans un autre thread, mais ça m'étonnerait...)

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut
    ah d'accord je n'avais pas compris ca comme ca.
    Et donc que dois je faire pour resoudre mon petit probleme?
    Cordialement
    Nasty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben en gros, dans ta méthode creation_rapport, il ne faut pas que tu accèdes directement aux contrôles. Le plus simple, c'est qu'avant de lancer le backgroundworker, tu récupères toutes les données dont tu as besoin dans le formulaire (txtdossier.Text etc) et que tu les stockes dans des variables. Et dans ton traitement, tu utilises ces variables plutôt que d'accéder aux contrôles.

    Pour le rapp_pdf.Visible, fais le plutôt juste avant de démarrer le backgroundworker

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Points : 414
    Points
    414
    Par défaut
    Ok je te remercie pour ton aide.
    Cordialement
    Nasty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'TODO : trouver une signature mieux que celle la

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.NET] BackgroundWorker trés lent
    Par Morphee_ dans le forum Framework .NET
    Réponses: 14
    Dernier message: 15/11/2012, 10h21
  2. Réponses: 1
    Dernier message: 25/05/2007, 17h35
  3. [.NET 2.0] Probleme de BackgroundWorker
    Par Aspic dans le forum Windows Forms
    Réponses: 5
    Dernier message: 22/03/2007, 15h13
  4. [VB.net] backgroundworker et UC à 100%
    Par grand_prophete dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/05/2006, 15h39
  5. [FW2.0][VB.net] backgroundworker
    Par grand_prophete dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/05/2006, 15h02

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