IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Sommaire > Multithreading
        Commment créer et lancer un thread ?
        Comment passer un ou plusieurs paramètres à un thread
        Comment arrêter un thread

        


Commment 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 Form.
Nous avons besoin de déclarer notre objet thread à l'intérieur de la Form.

Imports System.Threading Public Class Threads Inherits System.Windows.Forms.Form '........ Private _threadCalculs1 As Thread End Class
La fonction executée par le thread a une signature imposée par le 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() ' Traitement effectué par le thread. Calculs est une fonction quelconque de notre Form Try Calculs(1000) Catch ex As Exception Debug.WriteLine(ex.ToString()) End Try End Sub End Class
Pour démarer 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() _threadCalculs1 = New Thread(AddressOf ThrFunc1) 'ThrFunc est la fonction éxécutée par le thread. _threadCalculs1.Name = "Thread1" 'Il est parfois pratique de nommer les threads surtout si on en créé plusieurs. _threadCalculs1.Start() ' Démarrage du thread. End Sub End Class
lien :  System.Threading.Thread

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.
Passer des paramètres à un Thread revient donc à faire une classe contenant des variables ou acceuillir les paramètres.

Imports System.Threading Public Class ThreadsForm Inherits System.Windows.Forms.Form ' ........ 'premier Thread de calcul Private _threadCalculs1 As Thread 'Evenement pour signaler la fin des threads de Calcul Private _endThreadCalculsEvent As New ManualResetEvent(False) 'Classe ThreadCalculs Private Class ThreadCalculs 'form parente Private _frm As ThreadsForm 'temporisation Private _tempo As Integer 'Constructeur. frm et tempo sont les paramètres de notre Thread Public Sub New(ByVal frm As ThreadsForm, ByVal tempo As Integer) _frm = frm _tempo = tempo End Sub 'Fonction du Thread Public Sub ThrFunc() Try _frm.Calculs(_tempo) Catch ex As Exception Debug.WriteLine(ex.ToString()) End Try End Sub End Class 'Calculs Private Sub Calculs(ByVal tempo As Integer) While Not _endThreadCalculsEvent.WaitOne(tempo, False) 'Calculs fais ici ..... End While End Sub 'Démarrage du thread Private Sub StartThread() Dim myThreadObj As New ThreadCalculs(Me, 1000) _threadCalculs1 = New Thread(AddressOf myThreadObj.ThrFunc) _threadCalculs1.Name = "Thread1" _threadCalculs1.Start() End Sub
lien :  System.Threading.Thread
lien :  System.Threading.ManualResetEvent

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'execute en continu dans une boucle, il est nécéssaire d'écrire un code qui prévoit une condition
pour sortir de la boucle. Cette doit pouvoir être modifié 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 Threads Inherits System.Windows.Forms.Form '........ 'Evènement de signal de fin de thread Private _endThreadCalculsEvent As New AutoResetEvent(False) 'Pour arrêter le thread Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click _endThreadCalculsEvent.Set() 'L'evenement passe à l'état signalé _threadCalculs1.Join() 'On attend la fin du thread. End Sub 'Fonction du thread Private Sub ThrFunc1() Try Calculs(1000) Catch ex As Exception Debug.WriteLine(ex.ToString()) End Try End Sub Private Sub Calculs(ByVal tempo 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() _threadCalculs1.Abort() 'On demande au runtime d'arrêter le Thread _threadCalculs1.Join() 'On attend la fin du thread. End Sub
Un thread terminé ne peut plus être relancé. Il faut instancier un nouvel objet Thread pour chaque démarrage de thread.

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

        

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 © 2005 Abel Mandengue 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.