Pause-redemarageet stop avec une fonction récursive
cs_Naevis
Messages postés15Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention10 janvier 2009
-
22 nov. 2008 à 18:07
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 2011
-
24 nov. 2008 à 22:09
Salut,
Voilà,
Je cherche par l'intermédiaire de 3 boutons
le premier pour faire une pause sur la fonction récursive.
le deuxieme pour faire un stop de la fonction
le troiseme bouton pour continuer la fonction récurssive.
Est-ce possibe??
Car je suis nouveau dans VB.net.
Merci d'avance.
A voir également:
Pause-redemarageet stop avec une fonction récursive
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 23 nov. 2008 à 16:54
Salut,
L'astuce serait de faire exécuter ta fonction récursive dans un autre thread. Ainsi, tu pourras stopper, suspendre, continuer, arrêter le thread et par conséquent, ta fonction aussi vu que c'est le thread qui va l'exécuter.
Un petit exemple :
Note : La méthode Suspend() et Resume() sont obsolète mais tu peux toujours les utiliser. Ca t'affichera seulement deux avertissements.
<hr size="2" width="100%" />
Public Class Form1
Private _thread1 As Threading.Thread
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) HandlesMyBase.Load
_thread1 = New Threading.Thread(AddressOf ThrFunc1) ' ThrFunc1 est la fonction exécutée par le thread.
_thread1.Name = "Thread1"' Il est parfois pratique de nommer les threads surtout si on en créé plusieurs.
End Sub
Private Sub ThrFunc1()
' Traitement effectué par le thread.
Try
' Appel de ta Fonction Récursive
Catch ex As Exception
Debug.WriteLine(ex.ToString())
End Try
End Sub
Private Sub Lancer_Thread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Lancer_Thread.Click
_thread1.Start() ' Lance le thread
End Sub
Private Sub Suspendre_Thread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Suspendre_Thread.Click
_thread1.Suspend() ' Suspend le thread
End Sub
Private Sub Continuer_Thread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Continuer_Thread.Click
_thread1.Resume() ' Continue le thread suspendu
End Sub
Private Sub Arreter_Thread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Arreter_Thread.Click
_thread1.Abort() ' Arrête le thread
End Sub
End Class
cs_Naevis
Messages postés15Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention10 janvier 2009 24 nov. 2008 à 18:21
Merci pour l'info,
J'ai testé mais je n'y arrive pas.
J'essaye de voir ce qu'est un thread.. Mais je ne comprend pas ce que c'est-_-
Je suis super novice.
Pour info, la fonction récursive est les tour d'hanoi.
Peut-on m'explique ou me donner des indications pour mieux comprendre le thread.
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 24 nov. 2008 à 18:46
Salut,
Un thread permet de diviser l'application, il est conseillé de
s'en servir, notamment dans les taches complexes qui risquent de bloquer l'interface
Ainsi, si un Thread bloque ou ne réponds pas à cause d'une fonction qui effectue une tâche complexe, ton programme restera actif.
En effet, si on effectue une recherche ou une écriture sur le disque qui est plutôt longue dans le même thread que ton programme, l'interface graphique de celui-ci sera gelé et tu pourras rien faire pendant le temps de l'exécution de la tâche.
En résumé, un thread permet de réaliser des tâches en arrière plan.
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 24 nov. 2008 à 19:41
Sinon,
Tu pourrais mettre le code de ta fonction récursive et en même temps le soucis que tu rencontres avec l'exemple que j'ai mis précedemment pour le thread
cs_Naevis
Messages postés15Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention10 janvier 2009 24 nov. 2008 à 20:36
Voilà le code que j'ai pour ma fonction pour le moment.
C'est très brouillon. j'ai renomé pas mal de chose à ma sauce. Donc il y a un risque de ce perdre
Public Class Form1
Dim cpt As Integer
Dim expoH As Integer
Public Sub Hanoi(ByVal N As Double, ByVal A As Char, ByVal B As Char, ByVal C As Char)
ProgressBar1.Value = cpt
If N > 0 Then
ProgressBar1.Value = cpt
Hanoi(N - 1, A, C, B)
lbldpl().Text = lbldpl.Text & vbCrLf & "Déplacer de " & A & " vers " & B & "."
Application.DoEvents()
minicompteur.Text = "evolution: " & cpt & " / " & (ProgressBar1.Maximum) & "."
ProgressBar1.Value = cpt
cpt = cpt + 1
ProgressBar1.Value = cpt
Hanoi(N - 1, B, A, C)
ProgressBar1.Value = cpt
End If
minicompteur.Text = "evolution: " & cpt & " / " & (ProgressBar1.Maximum) & " ."
lblpct.Text = cpt / (ProgressBar1.Maximum) * 100 & "%"
End Sub
Private Sub startH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startH.Click
expoH = nbrann.Value
ProgressBar1.Maximum = (2 ^ expoH) - 1
startH.Enabled = False
endH.Enabled = True
RaZH.Enabled = False
nbrann.Enabled = False
lbldpl.Text = "étape à suivre pour" & Str(nbrann.Value) & " anneaux."
Hanoi(nbrann.Value, "A", "B", "C")
totetape.Text = " le nombre d'étapes est de " & (ProgressBar1.Maximum) & " mouvements."
endH.Enabled = True
RaZH.Enabled = True
End Sub
Private Sub RaZH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RaZH.Click
totetape.Text = "nombres d'étapes."
minicompteur.Text = " état en cours / total d'états à faire."
lblpct.Text = "Avancement en %. "
lbldpl.Clear()
startH.Enabled = True
nbrann.Enabled = True
ProgressBar1.Value = 0
cpt = 0
End Sub
Private Sub lbldpl_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbldpl.TextChanged
lbldpl.SelectionStart = lbldpl.TextLength
lbldpl.ScrollToCaret()
End Sub
Private Sub endH_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles endH.Click
End
End Sub
End Class
cs_Naevis
Messages postés15Date d'inscriptionsamedi 22 novembre 2008StatutMembreDernière intervention10 janvier 2009 24 nov. 2008 à 20:37
Là c'est le code de base, je n'ai pas rajouté le thread car je ne sais pas ou le mettre déjà.
Où le déclarer et faire en sorte que tout tourne correctement.
Ici je n'ai pas rajouté les fonctionnalités que je souhaite mettre plus haut.
Enfin, voilà:)
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 24 nov. 2008 à 20:40
Bon déjà je vois tout de suite pourquoi le thread ne fonctionne pas car tu ne peux accéder à des contrôles qui ne se trouvent pas dans le même thread que ta fonction.
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 24 nov. 2008 à 21:11
Bonne nouvelle,
J'ai trouvé comment faire, il faut que tu utilises le BackGroundWorker. On aura le même problème que précédemment , tu pourras pas intervenir sur tes contrôles.
La solution serait de déclarer des variables publiques et de transférer le contenu de tes variables (par exemple cpt) dans une de ses variables et celle-ci tu pourras l'utiliser avec ta progressbar.
C'est un peu dur à voir mais est ce que tu comprends ou tu as besoin d'un petit exemple ?
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 24 nov. 2008 à 22:09
Désolé pour l'attente, le serveur a du mal aujourd'hui'hui apparemment
Voici un petit exemple :
<hr size="2" width="100%" />On sait qu'avec un backgroundworker, on ne peut pas intervenir sur un contrôle directement.
L'astuce réside à déclarer une variable publique (ici, la variable i) et de mettre la valeur dedans.
Et c'est là que ça devient intéressant, quand une variable est déclarée de manière publique elle
peut être utilisée de n'importe quel thread.
En revanche, pour l'actualisation des différentes valeurs obtenues, il faut utiliser un timer.
Si tu as des questions sur ce code, n'hésites pas
<hr size="2" width="100%" />
Public Class Form1
Public i As Integer = 0
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
While (i < 2000)
i += 1
hbwait(100)
End While
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BackgroundWorker1.RunWorkerAsync()
Timer1.Enabled = True
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = i
End Sub
Friend Sub hbwait(ByVal ms_to_wait As Long)
Dim endwait As Double
endwait = Environment.TickCount + ms_to_wait
While Environment.TickCount < endwait
System.Threading.Thread.Sleep(1)
Application.DoEvents()
End While
End Sub