FAQ VB.NETConsultez toutes les FAQ

Nombre d'auteurs : 36, nombre de questions : 239, dernière mise à jour : 24 mai 2015  Ajouter une question

 

Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées sur le forum Développement DotNET

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle contient sont correctes. Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci.

Sur ce, je vous souhaite une bonne lecture.


SommaireMultithreading (4)
précédent sommaire suivant
 

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.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
Imports System.Threading 
  
Public Class Threads 
    Inherits System.Windows.Forms.Form 
  
    ' ... 
    Private _threadCalculs1 As Thread 
  
End Class
La fonction exécuté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.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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émarrer le thread, on utilise la fonction Start de la classe Thread.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Imports System.Threading 
  
Public Class Threads 
    Inherits System.Windows.Forms.Form 
  
    ' ... 
  
    Private Sub StartThread() 
        _threadCalculs1 = New Thread(AddressOf ThrFunc1) 'ThrFunc est la fonction exé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

Mis à jour le 30 novembre 2013 abelman

Le délégué System.Threading.ThreadStart utilisé pour les fonctions de thread ne prend pas de paramètre.
Passer des paramètres à un Thread revient donc à faire une classe contenant des membres qui serviront de paramètres

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Imports System.Threading 
  
Public Class ThreadsForm 
    Inherits System.Windows.Forms.Form 
  
    ' ... 
  
    ' Premier Thread de calcul 
    Private _threadCalculs1 As Thread 
    ' Évènement 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 faits 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 
End Class

Mis à jour le 30 novembre 2013 abelman

Le meilleur moyen 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 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.

Code vb.net : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Imports System.Threading 
  
Public Class Threads 
    Inherits System.Windows.Forms.Form 
  
    ' ... 
  
    ' Évè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'événement 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).

Code vb.net : Sélectionner tout
1
2
3
4
5
'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.

Mis à jour le 6 décembre 2013 abelman

Tout d'abord pensez à la clause « Imports System.Threading »
Pour changer le nom du thread courant, ajouter la ligne de code suivante :

Code vb.net : Sélectionner tout
Thread.CurrentThread.Name = "MainThread"
Ici on donne le nom « MainThread » au thread courant.

Si vous devez réaliser cela pour le thread principal, alors il faut ajouter cette ligne avant le « Application.Run ».

Mis à jour le 1er décembre 2013 sam_XIII

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2017 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et 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.

 
Responsable bénévole de la rubrique Microsoft DotNET : Hinault Romaric -