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 Thread et ProgressBar


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut Background Thread et ProgressBar
    Bonjour,

    J`espere que vous pourrez m`aider sur un probleme benin.
    Je mexplique, j`aimerais avoir ma progressbar qui se remplisse tout au long de l´execution d´un processus (requetes sur BD)
    Jai developpe une chose comme celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Import_thread_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles Import_thread.DoWork
            UDLimp.Import()
            Import_thread.ReportProgress(UDLimp.getpercent())
        End Sub
    ma fonction getpercent()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function getpercent() As Integer
            Return CInt(((nbCurrentOperation * 100) / nbMaxOperation))
        End Function
    puis ma fonction travaillant avec la bd boucle comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     For Each rows In objDataSet.Tables(0).Rows
    ....................................
    nb_currentOperation = nb_currentOperation + 1
                Next
    Le probleme du thread c qu´il reste dans UDLimp.Import() et execute une fois quil a fini la fonction ReportProgress
    Donc evidemment fini, je me retrouve avec un barre a 100 % ultra logique

    Je ne sais pas du fait ou executer cette fonction getPercent()
    Si vous avez une idee, je vous en remercie d´avance.
    Bonne journee
    Brice

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Si je comprends bien ton problème, j'ai l'impression qu'il faudrait que tu mettes l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Import_thread.ReportProgress(UDLimp.getpercent())
    au sein de ton import. Le code suivant est-iol bien une partie de ta méthode Import ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For Each rows In objDataSet.Tables(0).Rows
    ....................................
    nb_currentOperation = nb_currentOperation + 1
                Next
    Dis-moi si j'ai bien compris ou pas car j'ai une solution beaucoup plus propre à te proposer.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Oui c`est ca tu as entierement raison.
    Le truc c´est comment faire lorsque le composant backgroundthread et le progressbar sont sur une forme ,alors que le fonction import est une classe qui ne derive pas dune classe Form.

    Proposes moi ta solution.je suis preneur
    Merci de ton aide.
    Brice

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Pour les BackgroundWorker, au lieu de devoir faire remonter la progression à la form par quelques moyens obscures je préfère faire tout le travail dans le BackgroundWorker et dès que nécéssaire mettre à jour une propriété int de la form servant à afficher la progression.
    Du coté de la forme je lance un timer et je met à jour l'affichage de la progression dès que le int change ... comme ça on a pas à vérifier si on es dans le bon thread ou autre, tout est nikel

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    A mon avis, ta classe UDLImp devrait définir un événement du style OperationChanged qui se déclencherait à chaque changement d'opération. Ainsi, dans ta fonction d'import, tu aurais un code ressemblant à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    For Each rows In objDataSet.Tables(0).Rows
       ....................................
       nb_currentOperation = nb_currentOperation + 1
     
       ' Si un abonnement existe à l'événement OperationChanged, 
       ' alors déclencher l'événement
     
    Next
    Et dans ta Form, tu t'abonne de façon standard à cet événement.
    Tu peux définir le numéro d'opération courante comme argument de ton EventHandler (tu définis ton propre OperationChangedEventHandler et OperationChangedEventArgs), ainsi ta Form sera notifiée du numéro courant et tu pourras faire ton calcul.

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Oui c clair, oui je peux faire comme ca ,ca va marcher ,mais voila le code pourri lol
    C pas propre, et puis ca ne resoud pas le probleme,plus que ma fonction je la met dans une classe a part.
    Pour des soucis de comprehension de code, je vais pas coller tout dans dans le code de la form principale.
    Brice

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    J´essaye ca tout de suite et je te dis quoi.
    Brice

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par bgcode
    code pourri lol
    C pas propre
    ah ben pourquoi ? quand tu vois un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int position = Worker.GetProgressStatus();
    int max = Worker.GetMaxProgress();
    c'est pourri ? en plus pendant que la form affiche le résultat à l'écran le processus continue vu qu'il est dans un autre thread alors qu'avec un event, le thread travaillant est bloqué pendant la durée de l'affichage de la progression ... donc si pour x-raison l'affichage prend plus de temps que prévu, le travail est bloqué ...

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par smyley
    en plus pendant que la form affiche le résultat à l'écran le processus continue vu qu'il est dans un autre thread alors qu'avec un event, le thread travaillant est bloqué pendant la durée de l'affichage de la progression ... donc si pour x-raison l'affichage prend plus de temps que prévu, le travail est bloqué ...
    Pas si tu utilises une approche asynchrone utilisant du BeginInvoke à la place d'un simple Invoke.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  10. #10
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    Points : 553
    Points
    553
    Par défaut
    Smiley a raison en ce qui concerne le blocage dû à l'affichage. Là, il faut voir suivant la criticité de tes traitements. Mais honnêtement, je ne pense pas qu'une simple mise à jour du niveau de la ProgressBar puisse être quelque chose de pénalisant.

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par SaumonAgile
    Pas si tu utilises une approche asynchrone utilisant du BeginInvoke à la place d'un simple Invoke.
    Le BeginInvoke ça peut piéger au début car parfois on se retrouve à réentrer dans la même fonction alors qu'on en était pas encore sortit. Mais c'est vrai que c'est éfficace surtout avec les méthodes anonymes.

    Quand a l'affichage parfois pour moi il est très lent ( cf. DreamShield ) et au départ c'était vraiment lourd d'où l'utilité

  12. #12
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Comme la dit Smyley, vive le backgroundworker pour ce genre d'application sans probleme de gestion de threads :
    BackGroundWorker
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  13. #13
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Essaye avec les evements mais comprends rien, il me ferme lappli au declenchement de l´event je crois.

    Ds ma fonction Import()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Public Delegate Sub OperationChanged(ByVal sender As Object, ByVal value As EventArgs, ByVal data As Integer)
    Public Event showCurrent As OperationChanged
    puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                   nb_currentOperation = nb_currentOperation + 1
     
                    percent = CInt((nb_currentOperation * 100) / nb_operation)
     
                    If Not (e Is Nothing) Then
                        RaiseEvent showCurrent(Me, e, percent)
                        End
                    End If
    et dans ma form :

    Private WithEvents udl As UDLImport = New UDLImport()

    et une fonction qui intercepte levenement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub ShowPercent(ByVal sender As Object, ByVal e As EventArgs, ByVal value As Integer) Handles udl.showCurrent
            Console.WriteLine(value)
        End Sub
     
    Quest ce qui se passe , jai mal fait les choses ?
    Merci
    Brice

  14. #14
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    A mon sens avec tous ses events... tu va te compliquer la vie; Dans le BGW tu a deja 3 events inclus (debut, progression, fin) et puis la gestion des threads est faites aussi. Que demander de plus !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    progression oui bien sur
    As tu lu plus haut le soucis ?
    Brice

  16. #16
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par bgcode
    progression oui bien sur
    As tu lu plus haut le soucis ?
    Brice
    Oui et le BGW peut etre une bonne solution à mon sens
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  17. #17
    Membre à l'essai
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Points : 20
    Points
    20
    Par défaut
    Je l`utilise biensur.
    Fonctionnait pas dans le ProgressChanged ...

    Par contre fonctionne avec les evenements comme conseille ci dessus.
    Merci pour les infos
    Brice

  18. #18
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Citation Envoyé par bgcode
    Fonctionnait pas dans le ProgressChanged ...
    Bizarre tu as du faire une erreur de codage dans le coin. Si tu souhaites enrichir ton programme avec un code propre va voir la quand tu auras du temps :
    Comment utiliser un BGW
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 01/09/2010, 16h22
  2. [PERL/TK] Thread et ProgressBar
    Par remix55 dans le forum Interfaces Graphiques
    Réponses: 19
    Dernier message: 31/08/2010, 18h40
  3. Problème Thread et progressbar
    Par AnsuzPeorth dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 19/03/2010, 12h56
  4. thread et progressBar sous Visual C++
    Par goingoin dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 19/03/2009, 16h59
  5. Thread et ProgressBar
    Par Jidewe dans le forum VB.NET
    Réponses: 3
    Dernier message: 27/05/2008, 10h04

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