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 :

ProgressBar et chargement d'une form


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut ProgressBar et chargement d'une form
    Bonjour à tous !

    Le chargement de certaines form de mon programme est assez long, en raison d'un appel à une base SQLserver qui peut prendre du temps (surtout la première fois de la journée...).

    J'aimerais donc pouvoir utiliser une progressbar avec un composant Backroundworker pour ne pas donner l'impression à l'utilisateur que le programme est planté ou trop lent.

    Mais la progressbar ne bouge pas pendant le chargement de la form, alors que si je demande son incrémentation pendant un calcul long interne à la form qui l'accueille cela marche très bien.

    En résumé: Peut-on utiliser une ProgressBar pendant le chargement d'une autre form ?

    D'avance merci pour vos réponses, mais pensez quand même écouter de la musique ce soir

  2. #2
    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
    Bien sur que oui :
    Tiens pour le BGW : Par ici

    Good luck

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    bonjour Aspic et merci pour ta réponse.

    J'ai bien compris le principe. L'exemple que tu m'a fourni est basé sur un calcul long, c'est-à-dire une série d'instruction.

    Hors pour le chargement d'une forme il n'y a qu'une seule instruction, et je peux difficillement évaluer le degré d'avancement.

    Donc j'appelle ma form dans le thread principal et dans le thread secondaire je fait une boucle qui fait évoluer la progress bar.

    Cela marche...presque puisque la progressbar "freeze" et n'affiche un état d'avancement que lorsque la deuxième form est chargée !

    Pour info la 2ème form charge 8000 enregistrements dans un datagrid.

    Voilà donc mon problème : tous les exemples vus sont basés sur une procédure longue mais en boucle. Hors la procédure de chargement d'une form est longue...mais pas en boucle !

    Qu'en pensez-vous ?

    Cordialement,
    Kritopal

  4. #4
    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
    Salut,

    Effectivement pour ton premier probleme, si il n'y a que une seule operation très longue et que tu ne sais pas le temps que cela va prendre, utilise une progressbar en mode Marquee c'est à dire elle va défiler de droite à gauche comme lors du chargement de XP !

    Sinon pour tes 8 000 enregistrements, la tu peux utiliser le BGW sans problèmes puisque ta boucle est cencée boucler 8 000 fois

    Hors pour le chargement d'une forme il n'y a qu'une seule instruction, et je peux difficillement évaluer le degré d'avancement.
    PS: Pour infos, "Hors" dans ce contexte ca s'ecrit "Or"

    ++

  5. #5
    Candidat au Club
    Inscrit en
    Février 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Février 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    salut les amis le monde de developpement est grand,pour cela je propose une autre solution on travail seulement avec un Timer voici le code:

    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
    Sub loading()
            For i = 0 To ds.Tables("auto").Rows.Count - 1
                If TextBox1.Text = ds.Tables("auto").Rows(i).Item("user") And TextBox2.Text = ds.Tables("auto").Rows(i).Item("mp") Then
     
                    Dim f2 As New menu
                    f2.Show()
                    Me.Hide()
     
                ElseIf TextBox1.Text = ds.Tables("auto").Rows(i).Item("user") And TextBox2.Text <> ds.Tables("auto").Rows(i).Item("mp") Then
                    MessageBox.Show("mot de passe incorrect", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Sub
                ElseIf TextBox1.Text <> ds.Tables("auto").Rows(i).Item("user") And TextBox2.Text = ds.Tables("auto").Rows(i).Item("mp") Then
                    MessageBox.Show("User introuvable", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Sub
                ElseIf TextBox1.Text <> ds.Tables("auto").Rows(i).Item("user") And TextBox2.Text <> ds.Tables("auto").Rows(i).Item("mp") Then
                    MessageBox.Show("remplissez les champs vide", "erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
                    Exit Sub
                End If
            Next
        End Sub
     
     
    Private Sub authentification_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            conn = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=societe.mdb")
            cmd = New OleDbCommand
            With cmd
                .Connection = conn
                .CommandText = "select * from authentification"
            End With
            da = New OleDbDataAdapter(cmd)
            ds = New DataSet
            da.Fill(ds, "auto")
     
        End Sub
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Start()
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            End
        End Sub
     
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
     
            ProgressBar1.Value = ProgressBar1.Value + 1
            If ProgressBar1.Value = ProgressBar1.Maximum - 1 Then
                Timer1.Stop()
                loading()
            End If
     
        End Sub

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    138
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 138
    Points : 121
    Points
    121
    Par défaut
    Et si tu lances une form "d'attente" juste avant ta form à charger, qui ne contient qu'un message simple " Veuillez patientez svp..." Unefois que ta form est chargée, dans le "load", tu mets ta form d'attente en hide. J'ai fait quelquechose de similaire qui marche bien.
    Un truc comme ça:

    Dans ta form de base,sur l'événement qui lance celle longue à charger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            Chargement.Show() 'form de chargement
            Application.DoEvents()
            System.Threading.Thread.Sleep(300) ' j'ai mis un temps pour éviter un freeze de la form de chargement du au chargement de l'autre form
            Form_à_charger.ShowDialog()
    Dans la form à charger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        Private Sub Admin_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            'on enlève la form de chargement
            Chargement.Hide()
    end sub
    Je pense qu'il doit être tout à fait possible de gérer une progressbar qui s'incrémente sur ta form "chargement" à partir des données de ta base qui se chargent.

    C'était mes deux cents !

  7. #7
    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
    oui c'est possible je l'ai deja fait mais c'est vraiment pas le top comme méthode. En plus, j'ai eu des problemes de freeze lors d'une désérialisation qui durait assez longtemps mais j'ai reglé le probleme avec des délégués et threads...

  8. #8
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Points : 73
    Points
    73
    Par défaut
    Bonsoir !

    Merci sincèrement pour vos réponses, je les ai étudiées mais aucune ne me donne un résultat satisfaisant.

    La méthode de hulahup est intéressante mais j'ai quand même un freeze.

    Voilà mon code avec mes observations en utilisant un espion au debug :


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Me.bgw.RunWorkerAsync()
    Dim fr2 As New Form2
    fr2.Show()
    End Sub

    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
    'Je suis ici avant le début du chargement de la form2 (logique...)
    bgw.ReportProgress(0)
    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
    'Je suis là après le chargement du TableAdapter !!
    Me.pb1.Visible = True
    End Sub
    Ce n'est pas à cause du processeur, j'ai vérifié...
    Et j'ai essayé avec un DataReader, le résultat est le même.

    A vrai dire je ne vois pas trop de solution. snif..

    Bonne soirée quand même !

  9. #9
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Citation Envoyé par kritopal
    Bonjour à tous !

    Le chargement de certaines form de mon programme est assez long, en raison d'un appel à une base SQLserver qui peut prendre du temps (surtout la première fois de la journée...).

    J'aimerais donc pouvoir utiliser une progressbar avec un composant Backroundworker pour ne pas donner l'impression à l'utilisateur que le programme est planté ou trop lent.

    Mais la progressbar ne bouge pas pendant le chargement de la form, alors que si je demande son incrémentation pendant un calcul long interne à la form qui l'accueille cela marche très bien.

    En résumé: Peut-on utiliser une ProgressBar pendant le chargement d'une autre form ?
    Voilà ce que je te propose :
    1. Tu mets le chargement sur l'évènement Shown de ta form, comme ça elle sera déjà affichée et tu pourras utiliser une barre de progression que tu auras placée sur cette form.

    2. Si tu utilises un BGW, tu ne peux pas faire référence directement à ta barre de progression, puisque tu es dans un thread différent ! Pour cela, il faut utiliser la méthode Invoke et un delegate, si je me souviens bien. Je n'ai pas de code ni de lien sous la main, mais je te file ça demain si j'y pense. Je me suis fais un splash screen de chargement du tonnerre récemment D'ailleurs, ça ferait un bon sujet d'article ça

    3. Si ton traitement n'est pas extrement long, tu peux utiliser le style marquee pour la progressbar, mais le mieux quand meme, c'est le style blocks car l'utilisateur sait pour combien de temps il en a à poireauter. Personnellement, quand j'ai des requêtes en base longs, je fais un petit count juste avant pour récupérer le nombre d'itérations (pour pouvoir initialiser le progressbar.maximum, c'est important !). C'est du temps de traitement en plus mais c'est plus agréable pour l'utilisateur.

    EDIT : j'ai retrouvé l'article MSDN traitant des appels inter thread :
    http://msdn2.microsoft.com/en-us/lib...28(VS.80).aspx

Discussions similaires

  1. Problème de chargement d'une Form
    Par aiglelibre dans le forum Windows Forms
    Réponses: 3
    Dernier message: 11/05/2012, 14h58
  2. Chargement d'une form
    Par SoGood dans le forum VB.NET
    Réponses: 3
    Dernier message: 03/04/2012, 12h45
  3. Dessin au chargement d'une Form
    Par DiverSIG dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/05/2008, 20h25
  4. [C#] Problème action bloquante: chargement d'une form
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/05/2006, 17h00
  5. Réponses: 3
    Dernier message: 19/05/2006, 16h54

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