Pause-redemarageet stop avec une fonction récursive

cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 janvier 2009 - 22 nov. 2008 à 18:07
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 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:

12 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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

<hr size="2" width="100%" />
++

Fauve
<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 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.
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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.

Note : Si tu as d'autres questions, n'hésites pas 

++

Fauve
<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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

++

Fauve
<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 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
0
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 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à:)
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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.

Notamment, ProgressBar1

<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 janvier 2009
24 nov. 2008 à 20:43
Bon j'ai modifié un truc, j'ai nettoyé ma fonction de toute les progressbar.
j'ai mis progressbar1.value=cpt dans le Private sub startH
0
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 janvier 2009
24 nov. 2008 à 20:56
Car ce que j'essaye aussi, c'est de pouvoir faire une pause sur la progressbar, et les label qui me montrent l'état d'avancement.
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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 ?

++

Fauve
0
cs_Naevis Messages postés 15 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 10 janvier 2009
24 nov. 2008 à 21:39
je vais m'informer sur le backgroundworker
et voir comment remanier le tout.;).
Au cas ou peux-tu me montrer un exemple si tu as le temps.?
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
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

End Class

++

Fauve
<hr size="2" width="100%" />Pensez : Réponse Acceptée 
0
Rejoignez-nous