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] Fenêtre de chargement autonome et non autonome


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 46
    Points
    46
    Par défaut [VB.NET] Fenêtre de chargement autonome et non autonome
    Bonjour à tous,

    Je suis face à ce même problème et je n'arrive pas à trouver de solution. J'ai beau lire les explications et les exemples, faire mes propres recherches, tester avec des delegate, un SynchronizationContext... rien n'y fait, je ne comprends pas comment me débloquer.

    J'ai repris le code d'une fenêtre de chargement permettant de faire patienter l'utilisateur "indéfiniment" : la barre de progression se remplit toute seule, boucle une fois qu'elle est remplie complètement, de manière à faire patienter l'utilisateur lorsqu'on ne connait pas à l'avance le temps que prendra l'opération.
    Je remercie d'ailleurs vivement l'auteur de ce code, dont je ne me rappelle plus du nom (honte sur moi ).

    La fenêtre fonctionne très bien dans le mode précité, mais j'aimerais maintenant améliorer ce code en donnant la possibilité de faire avancer la barre de progression par le code appelant. J'ai appelé ces 2 modes :
    - autonome : description du code précité, qui fonctionne très bien
    - non autonome : code sur lequel je travaille et que je n'arrive pas à faire fonctionner.

    Voici le code complet de mes classes :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    ''' <summary>
    ''' Fenêtre de chargement permettant de faire patienter l'utilisateur.
    ''' La fenêtre se met toujours au dessus de toutes les autres.
    ''' Un thread gère le rafraichissement de cette fenêtre.
    ''' </summary>
    ''' <remarks>
    ''' Cette fenêtre ne doit pas être utilisée directement, mais via la classe LoadingA.
    ''' Il existe deux modes suivant le constructeur appelé :
    ''' - autonome : on ne connait pas à l'avance le nombre de pas de la barre de progression et celle-ci se remplit d'elle-même
    ''' - non autonome : on connait le nombre de pas de la barre de progression et il faut appeler la fonction StepIt pour la faire avancer
    ''' </remarks>
    <System.Runtime.InteropServices.ComVisible(True)> Friend Class FrmLoadingA
     
        Private m_close As Boolean = False
        Private m_autonomous As Boolean = False
     
        ''' <summary>
        ''' Constructeur.
        ''' </summary>
        ''' <param name="details">Texte de détails à afficher sur la fenêtre.</param>
        ''' <remarks>
        ''' Ce constructeur indique que la fenêtre est autonome : la barre de progression se remplit d'elle-même en boucle.
        ''' </remarks>
        Public Sub New(ByVal details As String)
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            With Me.PrgBarProgression
                .Style = ProgressBarStyle.Continuous
                .Minimum = 5
                .Maximum = 100
                .Step = 5
            End With
     
            If String.IsNullOrEmpty(details) Then
                Me.LabDetails.Text = "Traitement en cours..."
            Else
                Me.LabDetails.Text = details
            End If
     
            m_autonomous = True
        End Sub
     
        ''' <summary>
        ''' Constructeur.
        ''' </summary>
        ''' <param name="steps">Nombre d'étapes prévues.</param>
        ''' <param name="details">Texte de détails à afficher sur la fenêtre.</param>
        ''' <remarks>
        ''' Ce constructeur indique que la fenêtre est non autonome : la barre de progression est remplie via la fonction StepIt appelée par l'utilisateur.
        ''' </remarks>
        Public Sub New(ByVal steps As Integer, ByVal details As String)
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
            ' intialiser la barre de progression
            With Me.PrgBarProgression
                .Style = ProgressBarStyle.Continuous
                .Minimum = 0
                .Maximum = steps
                .Step = 1
            End With
     
            ' initialiser les labels
            Me.LabDetails.Text = details
     
            ' forcer la création du handle de fenêtre
            ' pour que les Invoke du thead puisse fonctionner...
            'Dim handle As IntPtr = Me.Handle
     
            ' refuser les contrôles inter-thread pour éviter l'exception "Opération inter-threads non valide"
            ' (DANGEREUX)
            'Control.CheckForIllegalCrossThreadCalls = False
     
            m_autonomous = False
        End Sub
     
        ''' <summary>
        ''' Afficher la fenêtre.
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Afficher()
            m_close = False
            Me.ShowDialog()
        End Sub
     
        ''' <summary>
        ''' Fermer la fenêtre.
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Fermer()
            m_close = True
        End Sub
     
        ''' <summary>
        ''' Avance la progression d'un pas.
        ''' </summary>
        ''' <param name="details">Le texte de détails associé.</param>
        ''' <remarks></remarks>
        Public Sub StepIt(ByVal details As String)
            If Not m_autonomous Then
                Me.LabDetails.Text = details
                Me.PrgBarProgression.PerformStep()
                Me.Refresh()
            End If
        End Sub
     
        ''' <summary>
        ''' Fermeture de la fenêtre -> arrêt du timer de rafraichissement.
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub FrmLoadingA_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            TimerRefresh.Stop()
        End Sub
     
        ''' <summary>
        ''' Ouverture de la fenêtre -> la mettre au dessus de tout et démarrer le timer.
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks></remarks>
        Private Sub FrmLoadingA_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            ' forcer la fenêtre en premier plan
            Me.TopLevel = True
            Me.TopMost = True
            ' démarrer le thread
            TimerRefresh.Start()
        End Sub
     
        ''' <summary>
        ''' A chaque impulsion du timer, vérifier s'il faut fermer la fenêtre
        ''' et comment rafraichir la barre de progression.
        ''' </summary>
        ''' <param name="sender"></param>
        ''' <param name="e"></param>
        ''' <remarks>
        ''' La barre de progression est remplie automatiquement en cas de fermeture.
        ''' </remarks>
        Private Sub TimerRefresh_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerRefresh.Tick
            ' fermeture ?
            If m_close Then
                Me.PrgBarProgression.Value = Me.PrgBarProgression.Maximum
                Threading.Thread.Sleep(200)
                Me.Close()
            End If
            ' boucle de progression
            If m_autonomous Then
                If Me.PrgBarProgression.Value = (Me.PrgBarProgression.Maximum - Me.PrgBarProgression.Step) Then
                    Me.PrgBarProgression.Value = Me.PrgBarProgression.Minimum
                End If
                Me.PrgBarProgression.PerformStep()
            End If
        End Sub
     
    End Class
     
    ''' <summary>
    ''' Classe gérant la fenêtre FrmLoadingA.
    ''' </summary>
    ''' <remarks></remarks>
    <System.Runtime.InteropServices.ComVisible(False)> Public Class LoadingA
     
        Private m_thread As System.Threading.Thread
        Private m_waitForm As FrmLoadingA
     
        ''' <summary>
        ''' Démarrage de l'affichage de la fenêtre.
        ''' </summary>
        ''' <param name="details">Texte de détails à passer à la fenêtre.</param>
        ''' <remarks>
        ''' Mode autonome.
        ''' </remarks>
        Public Sub Show(ByVal details As String)
            m_waitForm = New FrmLoadingA(details)
     
            If Not m_thread Is Nothing Then
                m_thread.Abort()
                m_thread = Nothing
            End If
     
            m_thread = New System.Threading.Thread(AddressOf m_waitForm.Afficher)
            m_thread.Start()
        End Sub
     
        ''' <summary>
        ''' Démarrage de l'affichage de la fenêtre.
        ''' </summary>
        ''' <param name="steps">Nombre de pas de la barre de progression.</param>
        ''' <param name="details">Texte de détails à passer à la fenêtre.</param>
        ''' <remarks>
        ''' Mode non autonome.
        ''' </remarks>
        Public Sub Show(ByVal steps As Integer, ByVal details As String)
            m_waitForm = New FrmLoadingA(steps, details)
     
            If Not m_thread Is Nothing Then
                m_thread.Abort()
                m_thread = Nothing
            End If
     
            m_thread = New System.Threading.Thread(AddressOf m_waitForm.Afficher)
            m_thread.Start()
        End Sub
     
        ''' <summary>
        ''' Faire avancer la barre de progression d'un pas.
        ''' </summary>
        ''' <param name="details">Le message de détails à mettre à jour.</param>
        ''' <remarks>
        ''' Uniquement pour le mode non autonome.
        ''' </remarks>
        Public Sub StepIt(ByVal details As String)
            m_waitForm.StepIt(details)
        End Sub
     
        ''' <summary>
        ''' Fermeture de la fenêtre.
        ''' </summary>
        ''' <remarks></remarks>
        Public Sub Close()
            m_waitForm.Fermer()
            m_thread.Join(10000)
            m_thread = Nothing
        End Sub
     
    End Class
    Et voici deux exemples d'utilisation :

    MODE AUTONOME (fonctionne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Dim load as LoadingA
     
    load = New LoadingA()
    load.Show("Chargement en cours...")
     
    ' ...................................
    ' ... traitement long et bloquant ...
    ' ...................................
     
    load.Close()
    MODE NON AUTONOME (ne fonctionne pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim load as LoadingA
     
    load = New LoadingA()
    load.Show(10, "Chargement en cours...")
     
    For i as Integer = 1 To 10
    	load.StepIt("Chargement étape " & i & "...")
    	' ...................................
    	' ... traitement long et bloquant ...
    	' ...................................
    Next
     
    load.Close()
    J'obtiens l'exception
    invalid cross-thread operation
    sur la ligne "Me.ShowDialog()" de la fonction "Afficher" de la form "FrmLoadingA".

    Une âme charitable pour m'aider à me débloquer ?
    Ce serait trop sympa !

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Bonjour j'aurai aimer utiliser les scripts pour afficher une barre de progression en mode automatique.
    Le problème est que je ne connait pas du tout vbs :s
    Et du coup je ne sais pas utiliser ces scripts ?
    Est-ce possible d'avoir un peut d'aide ?

    Merci, ca serai vraiment gentil

Discussions similaires

  1. [VB.net] Ecran de chargement
    Par Speranza dans le forum Windows Forms
    Réponses: 2
    Dernier message: 20/05/2006, 16h50
  2. [VB.NET] erreur de chargement d 'une DataGridView
    Par amazircool dans le forum Windows Forms
    Réponses: 1
    Dernier message: 21/04/2006, 17h18
  3. [.net] Fenêtres parent/enfant
    Par akrodev dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2006, 23h54
  4. [VB.NET] Échec du chargement de viewstate
    Par lucie.houel dans le forum ASP.NET
    Réponses: 2
    Dernier message: 21/11/2005, 09h25
  5. [MFC] Fenêtre de chargement
    Par Kant dans le forum MFC
    Réponses: 16
    Dernier message: 26/02/2004, 15h16

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