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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    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 chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    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 actif
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    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 confirmé
    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
    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 actif
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    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

  6. #6
    Membre actif
    Inscrit en
    Juillet 2003
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 29
    Par défaut
    J´essaye ca tout de suite et je te dis quoi.
    Brice

  7. #7
    Expert confirmé
    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
    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é ...

  8. #8
    Membre chevronné
    Inscrit en
    Juin 2007
    Messages
    459
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 459
    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.

+ 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