 |
Super-Logiciels pour vous |
 |
 |
AsSaydalani Un logiciel pour la gestion pharmaceutique ...
- ventes aux guichets, reglements - utilisation de codes barres - Base de données des médicament saisie et ajour - Gestion des achats et des fournisseurs - Gestion des peromptions - ... | | | |
Al Tana9olat Solution complète de la gestion des gares:
Quitances, voyages, loyers, ... | | | |
Al Hassib Comptabilité générale, Liasse comptable marocaine ... | | | |
Al Fondoki Logiciel de la gestion
hôteliere:
Réservations, main courante, poits de vente, dépôts, occupation des chambres, ... | | | |
| Plus |
|
Avenue des F.A.R. Rsidence Niama N6 - Ttouan (Maroc)
Tl :(+212) 8 90 60 52 25
Fax :(+212) 5 39 97 25 15
Mobile :(+212) 6 61 10 74 37
Email :mce@meta-computer.com
|
|
|
|
Acceuil vb.net(507) Les threads ou taches
|
| Les threads ou taches |
2011-02-05 |
|
Comment créer et lancer un thread ?
------------------------------------------------------
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 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.
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.
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
Comment passer un ou plusieurs paramètres à un thread ?
------------------------------------------------------------------------------
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
Imports System.Threading
Public Class ThreadsForm
Inherits System.Windows.Forms.Form
' ........
'premier Thread de calcul
Private _threadCalculs1 As Thread
' Evé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
Comment arrêter un thread ?
--------------------------------------------------
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 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'é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)
'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.
Comment changer le nom du thread courant ?
------------------------------------------------------------
Tout d'abord pensez à la clause "Imports System.Threading"
Pour changer le nom du thread courant, ajouter la ligne de code suivante :
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" . |
| Commentaires des visiteurs : |
|
|
|
|
|