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 :

Progress bar dans un nouveau thread ? [Débutant]


Sujet :

VB.NET

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Progress bar dans un nouveau thread ?
    Bonjour,

    Voici les éléments de base de mon problème:

    J'ai une form1 sur laquelle je met une Progress Bar nommée "PB" en mode visible = false.
    Dans cette form, j'ai une public sub nommée "Barre" qui va initialiser la Progress bar avec un certain nombre de valeurs.

    J'ajoute au projet une form2 qui Inherits de la form1.
    Sur cette form2, j'ajoute un bouton "BtGo" qui va effectuer 3 taches:
    La première va faire appel à ma sub "Barre" avec le paramètre True (rendre visible la Progress barre)
    La deuxième va effectuer un traitement assez long
    La troisième va faire appel à ma sub "Barre" avec le paramètre false (rendre invisible la Progress barre)

    L'objectif est que lorsque j'appuie sur le bouton "BtGo", la Progress barre devienne visible, que mon traitement long se fasse et qu'à la fin la Progress barre devienne invisible.
    (il faut noter que je ne gere pas ici le pourcentage d'avancement de la tache. Ma progress barre aura la valeur Max-1 dés le départ)

    Le problème:

    La Progress barre ne s'affiche qu'à la fin de mon traitement long.

    Prérogative:

    Je ne souhaite pas utiliser un BackGroundWorker pour l'appel à ma sub "Barre"
    Je souhaite que le code qui est dans "BtGo" reste tel qu'il est (dans la mesure du possible) et que tout se fasse dans la sub "Barre"

    J'ai essayé de créer un nouveau thread mais je ne sais pas gérer les inter-Thread.....

    Code:
    Voici le code de la form1

    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
    Public Class Form1
     
        Public Sub Barre(ByVal Start As Boolean)
     
            If Start = True Then
     
                '*** Paramétrage de la Progress Bar ***
                Pb.Minimum = 0
                Pb.Maximum = 5000
                Pb.Value = 4999 'Valeur maximum - 1
                Dim Pos As New System.Drawing.Point
                Pos.X = 0
                Pos.Y = 10
                Pb.Location = Pos
                'on defini la largeur de la barre, égale à la largeur de la form.
                Pb.Width = Me.Width
                Pb.Visible = True 'parce que la progress bar est visible(false) dans la form1
     
            Else
                Pb.Visible = False
            End If
     
        End Sub
     
    End Class
    et le code de la form2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class Form2
        Inherits Form1
     
        Private Sub BtGo_Click(sender As System.Object, e As System.EventArgs) Handles BtGo.Click
            'rendre la progress barre visible
            Barre(True)
     
            'appel au traitement long
            '.......
     
            'rendre la progress barre invisible
            Barre(False)
        End Sub
    End Class
    Par avance, merci à tous pour vos réponses.
    Yayou49

  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
    Bonsoir,

    Tout d'abord, tu dis avoir essayés de créer un thread mais sans succès...je pense que c'est principalement ce que tu as essayés de faire qu'il faut nous montrer sans cela il nous sera difficile de t'orienter correctement Même si je reste perplexe à l'idée de ne pas vouloir utiliser un composant BackgroundWorker, ce dernier étant destiné à rendre l'approche de la notion de thread UI bien plus abordable pour les débutants...o_O

    A suivre ...

  3. #3
    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
    Effectivement je ne vois pas pourquoi tu ne veux pas utiliser un BackgroundWorker. C'est fait pour ça, et c'est le moyen le plus simple, vu qu'il prévoit de base la gestion de la progression.

  4. #4
    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
    ton code s'exécute sur un thread qu'on appelle thread principal
    or c'est aussi ce thread qui sert à rafraichir l'interface
    quand on fait quelque chose qui dure plus de quelques centaines de millisecondes ca fige l'interface jusqu'à la sortie de ton code
    il te faut donc utiliser un thread pour faire ton traitement (le bgw est une encapsulation de thread donc il peut convenir aussi)

    tu peux garder ta méthode barre comme est elle mais le code du bouton ne peut pas rester tel quel, il doit démarrer un thread
    donc au lieu de te braquer et de demander l'impossible essaye de comprendre comment modifier l'interface quand on est sur un autre thread (.invoke) ou utilise le bgw qui permet de ne pas comprendre comment le faire justement ^^ (car ses évènements sont sur le thread principal)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Je ne sais pas si c'est ce que tu veux, mais il y a ceci en Caiguisé:

    http://www.codeproject.com/Articles/...read-made-easy

    Une autre affaire en CSharp:

    http://www.codeproject.com/Articles/...-Forms-and-You

    <
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Effectivement je ne vois pas pourquoi tu ne veux pas utiliser un BackgroundWorker. C'est fait pour ça, et c'est le moyen le plus simple, vu qu'il prévoit de base la gestion de la progression.
    J'ai posté un code en c# avec un interface simplifié au maximum ici (voir la 2ème version dans le dernier message de la discussion) :
    http://www.developpez.net/forums/d15...utiliser-avis/
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Solution
    Re Bonjour,

    Voici LA solution à mon problème:

    Un Grand Merci à Vincent

    Donc Form1:
    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
    54
    Imports System.Threading
     
    Public Class Form1
     
        Private mThread As Thread
     
     
     
        Public Sub DemarrerTraitement(tache As action)
     
            mThread = New Thread(New ThreadStart(Sub()
                                                     Me.Invoke(Sub(ctrl As Form1) DebutTraitement(ctrl), New Object() {Me})
                                                     tache.Invoke()
                                                     Me.Invoke(Sub(ctrl As Form1) FinTraitement(ctrl), New Object() {Me})
                                                 End Sub
                        ))
            mThread.Start()
     
        End Sub
     
     
        Private Sub DebutTraitement(window As Form1)
            window.Barre(True)
        End Sub
     
        Private Sub FinTraitement(window As Form1)
            window.Barre(False)
        End Sub
     
     
        Public Sub Barre(ByVal Start As Boolean)
     
            If Start = True Then
     
                '*** Paramétrage de la Progress Bar ***
                Pb.Minimum = 0
                Pb.Maximum = 5000
                Pb.Value = 4999 'Valeur maximum - 1
                Dim Pos As New System.Drawing.Point
                Pos.X = 0
                Pos.Y = 10
                Pb.Location = Pos
                'on defini la largeur de la barre, égale à la largeur de la form.
                Pb.Width = Me.Width
                Pb.Visible = True 'parce que la progress bar est visible(false) dans la form1
     
            Else
                Pb.Visible = False
            End If
     
        End Sub
     
     
    End Class
    et Form2:
    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
     
    Imports System.Threading
    Public Class Form2
        Inherits Form1
     
        Private Sub BtGo_Click(sender As System.Object, e As System.EventArgs) Handles BtGo.Click
     
     
     
            DemarrerTraitement(New Action(Sub()
     
                                              'appel au traitement long
                                              '.......
                                              For i = 1 To 100
                                                  Thread.Sleep(100)
                                              Next
                                              '.......
     
                                          End Sub))
     
     
        End Sub
     
    End Class

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

Discussions similaires

  1. Progress Bar dans Access
    Par shr3dpit dans le forum VBA Access
    Réponses: 6
    Dernier message: 24/11/2007, 05h52
  2. Progress Bar dans Tkinter ou autre module
    Par will97 dans le forum Tkinter
    Réponses: 3
    Dernier message: 16/03/2007, 23h11
  3. Contrôler progress bar dans IE
    Par gverca dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/01/2007, 12h50
  4. [MFC] Progress Bar dans un CButton
    Par Aymerik dans le forum MFC
    Réponses: 4
    Dernier message: 03/04/2006, 16h39
  5. progress bar dans une status bar ?
    Par raggadoll dans le forum C++Builder
    Réponses: 1
    Dernier message: 02/11/2005, 15h17

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