Arrêter une fonction par un bouton [Résolu]

-
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
Afficher la suite 

Votre réponse

2 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
259
0
Merci
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.
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
27 janvier 2014
1530 -
Bonjour, Salut Ucfoutu,
Et pas oublier le DoEvents
Utilisateur anonyme -
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.
lermite222
Messages postés
8724
Date d'inscription
dimanche 8 avril 2007
Statut
Contributeur
Dernière intervention
27 janvier 2014
1530 -
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+
ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Contributeur
Dernière intervention
11 avril 2018
259 -
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 ...
Utilisateur anonyme -
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
Commenter la réponse de ucfoutu
0
Merci
Merci pour vos réponses,
Merci "Utilisateur anonyme " pour ton exemple ça va m'aider beaucoup.
Commenter la réponse de emable

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.