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
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 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.
lermite222
Messages postés8702Date d'inscriptiondimanche 8 avril 2007StatutContributeurDernière intervention22 janvier 20202 3 nov. 2013 à 15:55
Bonjour, Salut Ucfoutu,
Et pas oublier le DoEvents
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és18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 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 ...
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
3 nov. 2013 à 15:55
Et pas oublier le DoEvents
5 nov. 2013 à 12:11
En .NET (présente section), il est fortement conseillé de l'oublier justement et de privilégier l'utilisation des threads.
Modifié par lermite222 le 6/11/2013 à 03:54
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+
Modifié par ucfoutu le 6/11/2013 à 08:31
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 ...
6 nov. 2013 à 13:43
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.