IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

FAQ ASP.NET/VB.NET

logo
Sommaire > Coté serveur > Manipulations des threads
        Comment arrêter un thread ?
        Comment passer un ou plusieurs paramètres à un thread ?
        Comment créer et lancer un thread ?



Comment arrêter un thread ?
auteur : abelman
Le meilleur moyen de d'arrêter un thread est de laisser sa fonction se terminer. Si une fonction de thread s'exécute en continu dans une boucle, il est nécessaire d'écrire un code qui prévoit une condition pour sortir de la boucle. Cette condition doit pouvoir être modifiée par d'autres threads. Reprenons l'exemple de notre Form (voir Q/R création d'un thread). Pour signaler au thread que nous souhaitons qu'il s'arrête, nous allons utiliser un objet de la classe System.Threading.AutoResetEvent. Dans la boucle de la fonction du thread, nous faisons attendre le thread pendant un court laps de temps. Si l'objet AutoResetEvent passe à l'état signalé, alors on sort du thread.

					Imports System.Threading

					Public Class Thread
					Inherits System.Windows.Forms.Form
					' ........
					' Evènement de signal de fin de thread private
					Private _endThreadCalculsEvent As AutoResetEvnet = New AutoResetEvent(False)

					' Pour arrêter le thread private
					Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs)
					' L événement passe à l'état signalé
					_endThreadCalculsEvent.Set
					' On attend la fin du thread.
					_threadCalculs1.Join
					End Sub

					Sub ThrFunc1()
					Try
					Calculs(1000)
					Catch ex As Exception
					Debug.WriteLine(ex.ToString)
					End Try
					End Sub

					Private Sub Calculs(ByVal tempor As Integer)
					'Si l'évenement est à l'état signalé, WaitOne renvoie true et la boucle se termine.
					While Not _endThreadCalculsEvent.WaitOne(tempo, False)
					' C'est ici ou notre thread fait son travail
					End While
					End Sub
					End Class
				
Il existe un moyen plus radical d'arrêter un thread, c'est l'utilisation de la fonction Thread.Abort. Lorsque vous appelez Abort, le Runtime lève une exception ThreadAbortException que le thread peut alors intercepter. C'est aussi pourquoi il est déconseillé d'utiliser Abort car on ne peut prévoir où en est le thread dans son traitement. Lever une exception peut interrompre le thread alors qu'il est dans une partie du code qu'il doit terminer avant de sortir. Un des exemples où on peut utiliser Abort sans risque : la fonction du thread est bloquée infiniment sur un appel (une attente de connexion socket par exemple)

					' Forcer la fin du thread
					Private Sub AbortThread()
					' On demande au runtime d'arrêter le Thread
					_threadCalculs1.Abort
					' On attend la fin du thread.
					_threadCalculs1.Join
					End Sub
				
Un thread terminé ne peut plus être relancé. Il faut instancier un nouvel objet Thread pour chaque démarrage de thread.

lien : fr System.Threading.Thread
lien : fr System.Threading.AutoResetEvent

Comment passer un ou plusieurs paramètres à un thread ?
auteur : abelman
Le délégué System.Threading.ThreadStart utilisé pour les fonctions de thread ne prend pas de paramètres. Pour passer des paramètres à un thread, il vous faut créer une classe pour contenir les paramètres et la méthode du thread.

					Public Class ThreadParametre
					Private _text As String
					Private _entier As Integer

					Public Sub New(ByVal texte As String, ByVal entier As Integer)
					_text = texte
					_entier = entier
					End Sub

					Public Sub ExecuteThread()
					Dim i As Integer = 0
					While i < _entier
					Console.WriteLine("Index : " + i)
					Console.WriteLine("Message : " + _text)
					System.Math.Min(System.Threading.Interlocked.Increment(i),i-1)
					End While
					End Sub
					End Class
				

					Public Class Exemple

					Public Shared Sub Main()
					Dim ExempleThread As ThreadParametre = New ThreadParametre("Message de test", 5)
					Dim t As Thread = New Thread(New ThreadStart(ExempleThread.ExecuteThread))
					t.Start
					End Sub
					End Class
				
lien : fr System.Threading.Thread

Comment créer et lancer un thread ?
auteur : abelman
Pour créer un thread, il faut utiliser la classe System.Threading.Thread. Considérons que l'on dispose d'une WebForm. Nous avons besoin de déclarer notre objet thread à l'intérieur de la WebForm.

					Imports System.Threading

					Public Class Threads
					Inherits System.Web.Form
					Private _threadCalculs1 As Thread
					End Class
				
La fonction exécutée par le thread a une signature imposée par le .NET Framework. Il s'agit du délégué System.Threading.ThreadStart. C'est une fonction qui ne prend aucun paramètre et ne possède pas de valeur de retour. On peut la déclarer ainsi dans notre Form.

					Imports System.Threading

					Public Class Threads
					Inherits System.Windows.Forms.Form

					Private Sub ThrFunc1()
					Try
					Calculs(1000)
					Catch ex As Exception
					Debug.WriteLine(ex.ToString)
					End Try
					End Sub
					End Class
				
Pour démarrer le thread, on utilise la fonction Start de la classe Thread.

					Imports System.Threading

					Public Class Threads
					Inherits System.Windows.Forms.Form

					Private Sub StartThread()
					' ThrFunc est la fonction exécutée par le thread.
					_threadCalculs1 = New Thread(New ThreadStart(ThrFunc1))
					' Il est parfois pratique de nommer les threads surtout si on en créé plusieurs.
					_threadCalculs1.Name = "Thread1"
					' Démarrage du thread.
					_threadCalculs1.Start
					End Sub
					End Class
				
lien : fr System.Threading.Thread


Consultez les autres F.A.Q's


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2007 Dotnet Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.