FAQ VB.NETConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 240, dernière mise à jour : 12 mai 2018 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.
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 |
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 |
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 |
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 |
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 |
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 |
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"
Si vous devez réaliser cela pour le thread principal, alors il faut ajouter cette ligne avant le « Application.Run ».
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 çaLes 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 © 2024 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.