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] Pb avec le bouton Annuler d'1 barre de progression


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [VB.NET] Pb avec le bouton Annuler d'1 barre de progression
    Hello,
    J'avais besoin dans mon logiciel qu'une barre de progression s'affiche lorsqu'une opération prend un certain temps.
    J'ai donc créé une classe avec formulaire (que j'ai appellée "Attente") qui affiche une progressbar dans une nouvelle fenetre et qui l'update au fur et à mesure de l'avancement du traitement.
    Tout ça marche bien, mais maintenant, je voudrais permettre à l'utilisateur d'annuler l'opération si elle prend trop de temps.
    J'ai donc ajouté un bouton Annuler, une procédure lors de l'évenement click du bouton qui met à vrai un variable booléenne globale que je vérifie à chaque mise à jour de la barre de progression.
    Pour résumer, quand on clique sur le bouton annuler, la procédure appelante qui fait une opération longue est averti qu'elle doit arreter le traitement.

    Seulement, le problème, c'est que j'ai beau cliquer sur le bouton annuler, rien ne se passe, car l'événement Click de bt_annule n'est jamais déclanché. Je ne sais pas si ça peut venir du fait que la procédure appelante monopolise le processeur?!? Je ne comprend pas Comment faire pour que mon bouton marche correctement?

    Merci de votre aide

    Voici mon code:

    Dans le procédure appelante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Dim att As New Attente
    att.Ouvre("Veuillez patienter pendant ...", "Création de ...", nb_iteration, True)
    'Traitement 1
    For i=0 to nb_iteration
        'Traitement 2
        If att.MAJ(i + 1) Then Exit For
    next i
    att.Dispose()
    Dans ma classe:
    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
     
    Public Class Attente
        Inherits System.Windows.Forms.Form
     
        Dim annule As Boolean = False
     
        Public Sub Ouvre(ByVal Texte As String, ByVal titre As String, ByVal Max As Integer, ByVal annulation As Boolean)
            l_texte.Text = Texte
            Me.Text = titre
            BT_Annule.Visible = annulation
            ProgressBar.Minimum = 0
            ProgressBar.Maximum = Max
            ProgressBar.Value = 0
            annule = False
            Me.Show()
        End Sub
     
        Public Function MAJ(ByVal avancement As Integer) As Boolean
            If avancement > ProgressBar.Maximum Then avancement = ProgressBar.Maximum
            If avancement < ProgressBar.Minimum Then avancement = ProgressBar.Minimum
            ProgressBar.Value = avancement
            ProgressBar.Update()
            Me.Update()
            Return (annule)
        End Function
     
        Private Sub BT_Annule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Annule.Click
            annule = True
            MsgBox("Voila ce qu'on devrait voir si le bouton annuler renvoyait correctement l'évenement")
        End Sub
    End Class
     
    ----------------------------------------------------------------
     
    #Region " Code généré par le Concepteur Windows Form "
     
        Public Sub New()
            MyBase.New()
     
            'Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
     
        End Sub
     
        'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Requis par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
        'Ne la modifiez pas en utilisant l'éditeur de code.
        Friend WithEvents BT_Annule As System.Windows.Forms.Button
        Friend WithEvents l_texte As System.Windows.Forms.Label
        Friend WithEvents ProgressBar As System.Windows.Forms.ProgressBar
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.ProgressBar = New System.Windows.Forms.ProgressBar
            Me.BT_Annule = New System.Windows.Forms.Button
            Me.l_texte = New System.Windows.Forms.Label
            Me.SuspendLayout()
            '
            'ProgressBar
            '
            Me.ProgressBar.Location = New System.Drawing.Point(24, 88)
            Me.ProgressBar.Name = "ProgressBar"
            Me.ProgressBar.Size = New System.Drawing.Size(240, 24)
            Me.ProgressBar.Step = 1
            Me.ProgressBar.TabIndex = 0
            '
            'BT_Annule
            '
            Me.BT_Annule.Location = New System.Drawing.Point(192, 128)
            Me.BT_Annule.Name = "BT_Annule"
            Me.BT_Annule.Size = New System.Drawing.Size(72, 24)
            Me.BT_Annule.TabIndex = 1
            Me.BT_Annule.Text = "Annuler"
            '
            'l_texte
            '
            Me.l_texte.Location = New System.Drawing.Point(24, 16)
            Me.l_texte.Name = "l_texte"
            Me.l_texte.Size = New System.Drawing.Size(240, 56)
            Me.l_texte.TabIndex = 2
            Me.l_texte.Text = "Veuillez Patienter"
            Me.l_texte.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
            '
            'Attente
            '
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(288, 166)
            Me.Controls.Add(Me.l_texte)
            Me.Controls.Add(Me.BT_Annule)
            Me.Controls.Add(Me.ProgressBar)
            Me.MaximizeBox = False
            Me.MinimizeBox = False
            Me.Name = "Attente"
            Me.ShowInTaskbar = False
            Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
            Me.Text = "Attente"
            Me.ResumeLayout(False)
     
        End Sub
     
    #End Region

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Threads
    J'ai recherché un peu, et donc partant du principe que la classe appelante utilise tout le CPU, j'ai cherché à utiliser les threads: peut etre que ca pourrait résoudre le problème.
    Mon idée à la base, c'etait de créer un thread en appelant la fonction new de la classe attente, mais en faisant ca, je ne peux pas récupérer l'instance de la classe attente, et donc je peux pas l'utiliser depuis la classe appelante.
    Comment faire pour avoir deux classes (form) qui soient indépendantes l'une de l'autre au niveau des threads ou en tout cas que celle qui fait un traitement n'empeche pas la deuxieme d'etre active?

    Merci

  3. #3
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    En tant normal, il faut utiliser BeginInvoke et EndInvoke pour mettre à jour l'UI pendant un traitement.
    1)http://www.developpez.com/cours/
    2)Recherche
    3)Posez votre question en suivant les règles
    _oOo-DrQ-oOo_

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [VB.net][Résolu] Fenetre de progression indépendante
    Je sais pas... En fait, j'ai fini par réussir en utilisant des threads mais j'ai bien galéré:

    Je mets tout mon code si jamais ca peut aider quelqun...

    Voici le code appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Me.Cursor = Cursors.WaitCursor
    Thread.CurrentThread.Priority = ThreadPriority.Lowest
    Dim att As New Attente
    att.Ouvre(Me, "Veuillez patienter pendant ...", "Création de ...", MonNombreMaxdElement, True)
    End If
    Traitement 1
    For i=0 to MonNombreMaxdElement
        Traitement 2
        If att.MAJ(i + 1) Then Exit For
    Next i
    att.attend()
    Me.Cursor = Cursors.Default
    Thread.CurrentThread.Priority = ThreadPriority.Normal
    Voici le code de ma classe Attente:
    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
    Imports System.Threading
     
    Public Class Attente
        Inherits System.Windows.Forms.Form
     
        Dim annule As Boolean = False
        Dim FParent As System.Windows.Forms.Form
        Dim t As Thread
     
        Public Function Ouvre(ByVal f As System.Windows.Forms.Form, ByVal Texte As String, ByVal titre As String, ByVal Max As Integer, ByVal annulation As Boolean) As Thread
            FParent = f
            l_texte.Text = Texte
            Me.Text = titre
            BT_Annule.Visible = annulation
            ProgressBar.Minimum = 0
            ProgressBar.Maximum = Max
            ProgressBar.Value = 0
            annule = False
            Dim MonThread As New Thread(New ThreadStart(AddressOf Affiche))
            MonThread.Start()
            t = MonThread
        End Function
     
        Sub Affiche()
            Me.ShowDialog(FParent)
            Me.Dispose()
        End Sub
     
        Sub attend()
            t.Join()
        End Sub
     
        Public Sub Chg_texte(ByVal Texte As String, ByVal titre As String)
            l_texte.Text = Texte
            Me.Text = titre
        End Sub
     
        Public Function MAJ(ByVal avancement As Integer) As Boolean
            If avancement > ProgressBar.Maximum Then avancement = ProgressBar.Maximum
            If avancement < ProgressBar.Minimum Then avancement = ProgressBar.Minimum
            ProgressBar.Value = avancement
            ProgressBar.Update()
            Me.Update()
            If avancement >= ProgressBar.Maximum Then
                Thread.CurrentThread.Sleep(0)
                Me.Close()
            End If
            Return (annule)
        End Function
     
        Private Sub BT_Annule_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_Annule.Click
            annule = True
            Me.Close()
        End Sub
    End Class
     
     
    *********
    #Region " Code généré par le Concepteur Windows Form "
     
        Public Sub New()
            MyBase.New()
     
            'Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            'Ajoutez une initialisation quelconque après l'appel InitializeComponent()
     
        End Sub
     
        'La méthode substituée Dispose du formulaire pour nettoyer la liste des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Requis par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE : la procédure suivante est requise par le Concepteur Windows Form
        'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
        'Ne la modifiez pas en utilisant l'éditeur de code.
        Friend WithEvents BT_Annule As System.Windows.Forms.Button
        Friend WithEvents l_texte As System.Windows.Forms.Label
        Friend WithEvents ProgressBar As System.Windows.Forms.ProgressBar
        <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
            Me.ProgressBar = New System.Windows.Forms.ProgressBar
            Me.BT_Annule = New System.Windows.Forms.Button
            Me.l_texte = New System.Windows.Forms.Label
            Me.SuspendLayout()
            '
            'ProgressBar
            '
            Me.ProgressBar.Location = New System.Drawing.Point(24, 88)
            Me.ProgressBar.Name = "ProgressBar"
            Me.ProgressBar.Size = New System.Drawing.Size(240, 24)
            Me.ProgressBar.Step = 1
            Me.ProgressBar.TabIndex = 0
            '
            'BT_Annule
            '
            Me.BT_Annule.Location = New System.Drawing.Point(192, 128)
            Me.BT_Annule.Name = "BT_Annule"
            Me.BT_Annule.Size = New System.Drawing.Size(72, 24)
            Me.BT_Annule.TabIndex = 1
            Me.BT_Annule.Text = "Annuler"
            '
            'l_texte
            '
            Me.l_texte.Location = New System.Drawing.Point(24, 16)
            Me.l_texte.Name = "l_texte"
            Me.l_texte.Size = New System.Drawing.Size(240, 56)
            Me.l_texte.TabIndex = 2
            Me.l_texte.Text = "Veuillez Patienter"
            Me.l_texte.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
            '
            'Attente
            '
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(288, 166)
            Me.Controls.Add(Me.l_texte)
            Me.Controls.Add(Me.BT_Annule)
            Me.Controls.Add(Me.ProgressBar)
            Me.MaximizeBox = False
            Me.MinimizeBox = False
            Me.Name = "Attente"
            Me.ShowInTaskbar = False
            Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
            Me.Text = "Attente"
            Me.ResumeLayout(False)
     
        End Sub
     
    #End Region

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

Discussions similaires

  1. [XL-2007] Exit Sub avec le bouton annuler de plusieurs inputbox.
    Par sybiou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 08/07/2014, 13h15
  2. [Débutant] En ASP.NET, comment afficher un messagebox avec deux boutons OUI/NON?
    Par ronot dans le forum ASP.NET
    Réponses: 2
    Dernier message: 29/01/2013, 16h29
  3. Réponses: 3
    Dernier message: 18/04/2011, 09h57
  4. Problème avec bouton annuler d'impression
    Par zanoubya dans le forum Débuter
    Réponses: 10
    Dernier message: 16/12/2008, 18h19
  5. Problème avec le bouton Annuler de la fonction Inputbox
    Par r0main2b dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/06/2007, 19h48

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