Arrêter une fonction par un bouton

Résolu
emable - Modifié par emable le 1/11/2013 à 17:22
 emable - 7 nov. 2013 à 10:35
Bonjour,
S'il vous plait aidez-moi;
j'ai une une fenêtre avec deux boutons,B1:Simuler et B2:StopSim
le premier lance une fonction 'simulation' et en même temps rend le deuxième actif.
Je veux que le deuxième bouton B2 me permet d'arrêter la fonction 'simulation' à tout moment.
Est ce que c'est possible et comment faire. Merci

2 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
1 nov. 2013 à 17:59
Bonjour,
il te suffit d'une variable booléenne générale toto et, au sein de ta fonction : dire par exemple while not toto. Er passer toto = True dans le bouton d'arrêt.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 2
3 nov. 2013 à 15:55
Bonjour, Salut Ucfoutu,
Et pas oublier le DoEvents
0
Utilisateur anonyme
5 nov. 2013 à 12:11
Salut,
Et pas oublier le DoEvents
En .NET (présente section), il est fortement conseillé de l'oublier justement et de privilégier l'utilisation des threads.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 2
Modifié par lermite222 le 6/11/2013 à 03:54
Salut Banana,
Vaux mieux un DoEvents plutôt que rien du tout.
Et travailler sur des threads différents pour quelque lignes de code me parais un peu lourd.
Serait alors plus simple de conseiller un Timer qui lui travaille justement dans un thred différent.
A+
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 6/11/2013 à 08:31
Bonjour,
Comment gérez-vous techniquement (que ce soit par un thread distinct ou un timer) la disponibilité du bouton d'annulation (ce que permet le DoEvents, en "passant la main" aux autres évènements système) ?.

(juste pour satisfaire ma curiosité de non vb.nettiste).
PS : vous reconstrusez un évènement click indépendant de ce bouton ?
Vous "kookez" la fenêtre que constitue ce bouton et reconstruisez son évènement click ?
Cela m'intéresse ...
0
Utilisateur anonyme
6 nov. 2013 à 13:43
Bonjour à tous,
J'ai réalisé un petit exemple pour contenter tout le monde.
Déléguer des calculs longs à un thread n'est pas compliqué, récupérer des informations venant de lui l'est à peine un peu plus. Et pour l'arrêter on utilise sa méthode Abort.
A tester dans un projet winform entièrement vierge.

Option Strict On
Public Class Form1
'placement de contrôles sur le form
Dim lblA As New Label With {.Parent = Me, .BackColor = Color.LightSteelBlue, .AutoSize = True}
Dim lblB As New Label With {.Parent = Me, .BackColor = Color.LightSteelBlue, .AutoSize = False}
Dim btnA As New Button With {.Parent = Me, .Location = New Point(0, 30), .Text = "démarrer"}
'déclaration du thread
Dim t As Threading.Thread
'déclaration du délégué affichage
Private Delegate Sub DelegateTh(ByVal seneder As Object, ByVal valeur As Double)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'gestionnaire d'événement bouton
AddHandler btnA.Click, AddressOf btnAclick
End Sub

Private Sub btnAclick(ByVal sender As Object, ByVal e As EventArgs)
If DirectCast(sender, Button).Text = "démarrer" Then
'démarrage d'un thread (lui demandant d'exécuter 'job')
t = New Threading.Thread(AddressOf job)
t.Start()
DirectCast(sender, Button).Text = "stop"
Else
'arret du thread s'il existe
If Not t Is Nothing Then t.Abort()
DirectCast(sender, Button).Text = "démarrer"
End If
End Sub

Private Sub job()
'simulation d'un calcul long, pénible et ennuyeux
For x As Double = 0.0 To 1 Step 0.00001
'test si invoke requis (threads différents)
If Me.InvokeRequired Then
'invocation du délégué (qui se réfère à la sub affichage
'remarque : on passe les paramètres (sender:Me et e:x)
Me.Invoke(New DelegateTh(AddressOf Affichage), Me, x)
Else
'si invoke pas requis, exécution de la sub directement
Affichage(Me, x)
End If
Next
'on passe ici -1 en paramètre (le thread prend fin)
If Me.InvokeRequired Then
Me.Invoke(New DelegateTh(AddressOf Affichage), Me, -1)
Else
Affichage(Me, -1)
End If
End Sub

Private Sub Affichage(ByVal sender As Object, ByVal e As Double)
If e >= 0 Then
'affichage parametre e sur un label
lblA.Text = e.ToString("00.00%")
'redimmentionnement label
lblB.Width = Convert.ToInt32(e * 250)
Else
btnA.Text = "démarrer"
MessageBox.Show("fin de l'exécution du thread")
End If
End Sub
End Class
0
Merci pour vos réponses,
Merci "Utilisateur anonyme " pour ton exemple ça va m'aider beaucoup.
0
Rejoignez-nous