Beruflich Dokumente
Kultur Dokumente
en .NET
V7
Page 1
Introduction
Windows depuis 2000 utilise la POO pour représenter et
manipuler des objets physiques et abstraits
Les objets :
Définition
• Un objet est une instance en phase d'exécution d’un type
d’objet défini de façon statique
Caractéristique
• Un type d’objet = classe d’objet
• héritage
• pas de polymorphisme
Exemple d’objets dans Windows 2003 Server
Processus
Thread
Fichier
Mutex
Sous système Win 32
3 D. Bourget
Types d’objets
L’exécutif Windows 2003 utilise trois sortes d’objets
les objets de l’exécutif
les objets du noyau
Les objets du mode sécurité
Les objets de l’exécutif :
Un processus est une occurrence du type objet "Processus"
• System.Diagnostics.Process,
Un fichier est une occurrence du type objet fichier
• System.IO.StreamReader, System.IO.Stream, etc
Un Mutex est une occurrence du type objet Mutex
• System.Threading.Mutex
Un Thread est une occurrence du type objet "Thead«
• System.Threading.Thread, System.Threading.ThreadPool
Etc etc
4 D. Bourget
Page 2
Gestionnaire d’objets
Gestion des objets :
Mécanisme de comptage des objets
Mise en place d’un service au niveau de la rétention d’objets
Prendre en compte les contraintes d’environnement.
Regroupement des fonctions de protection des objets
Intégration en tant qu’objet des fichiers, périphériques
Le gestionnaire d’objets Windows exécute les fonctions
suivantes :
Allocation de mémoire
Attribution d’un descripteur de sécurité
Création d’une structure de répertoire d’objet
Gestion de cette structure
• les objets sont stockés dans cette structure
Gréation d’un Handle d’objet
• Un handle d’objet est un index dans une table d’objets
spécifique à un processus
Retour à l’appelant
5 D. Bourget
Gestionnaire d’objets
Mode de fonctionnement :
Tous les processus disposent d’un handle sur un objet.
Le thread utilisera cet handle
• thread d’un processus
Les handles sont des pointeurs indirects sur les ressources
du système
Chaque fois qu’un thread utilise un handle le gestionnaire
d’objet vérifie les droits d’accès
Surveillance des objets temporaires (GC)
Surveillance de l’utilisateur des ressources
Le moniteur de référence de la sécurité est automatiquement
appelé lorsqu’un processus ouvre un handle sur un objet
Par la suite c’est le gestionnaire d’objets qui assure la
cohérence au niveau de la sécurité.
6 D. Bourget
Page 3
Description d’un objet
Nom de l’objet
Répertoire de l’objet
En tête de Descripteur de sécurité
l’objet Charges de quota
Compteur de handles ouverts
Bases de données de handles ouverts
permanent ou temporaire
Mode noyau ou mode utilisateur
pointeur sur les type de l’objet
Corps de
l’objet
7 D. Bourget
Page 4
Types d’objet
Objet
Processus
Objet-type
de processus
Objet
Processus
Objet
Processus
9 D. Bourget
Processus Windows
Processus Héritage
1
Thread 1
Descripteur 1
Descripteur 2
Descripteur 3 Thread 2
Descripteur 4
Fichier 1
Table d’objets
10 D. Bourget
Page 5
Partage d’un objet
Processus
1
thread 1
Processus
événement 2
thread 1
Table d’objets
du processus 1
Table d’objets
du processus 2
11 D. Bourget
Processus et Threads
Page 6
Processus
Un processus est constitué :
D'un programme exécutable (code + données)
D'un espace d'adressage privé
De ressources systèmes
• mutex
• fichiers
• ports de communication
• moniteur
Au moins Un "fils" d'exécution (Thread)
13 D. Bourget
Processus Objets
1 disponibles
thread
1
thread2
fichier
Table d’objets
du processus 1
14 D. Bourget
Page 7
Thread
Description d'un thread :
Un ID unique
Contenu de l ’ensemble des registres (état du
processeur)
Deux piles :
• mode utilisateur
• mode noyau
Une zone privée de données utilisée par les sous-
systèmes, les bibliothèques de liaison dynamique (DLL)
Chaque thread peut être ordonnancé indépendamment
sur le processeur (fiber), peu utilisé.
Un thread se trouve dans l'espace d'adressage virtuel
d'un processus
Attention à partir de Windows Vista, Windows 7,
Windows 2008 server R2 il existe un mode sécurité
15 D. Bourget
16 D. Bourget
Page 8
Processus
18 D. Bourget
Page 9
La classe "Process"
Un élément de la classe "Process" fournit l'accès à un
processus en cours d'exécution
On peut considérer qu'un processus est une
application en cours d'exécution.
Il ne faut pas confondre un processus et un thread
(appelé également "processus léger"). Un thread aura
pour fonction d'exécuter une partie du code du
processus.
Les fonctionnalités d'un objet instance de la classe
"Process" sont :
Démarrer un processus
Arrêter un processus
Contrôler un processus ou plusieurs processus
Surveiller les processus
19 D. Bourget
La classe Process
Un composant de la classe "Process" permet
l'accès aux processus système.
Différentes informations sont accessibles via
le composant issu de la classe "Process".
Les informations accessibles sont :
les threads composants le processus (au moins
un)
les modules chargés (fichiers .dll et .exe)
les informations sur la quantité de mémoire utilisée
par le processus, le PID du processus
les informations au niveau du groupe de processus
auquel le processus appartient
20 D. Bourget
Page 10
La classe Process
Propriétés publiques
Id : Obtient l'identificateur unique du processus associé.
HasExited : Obtient une valeur indiquant si le processus
associé s'est terminé.
ProcessName : Obtient le nom du processus.
StartInfo : Obtient ou définit les propriétés à passer à la
méthode Start de Process.
Threads : Obtient le jeu des threads en cours d'exécution
dans le processus associé. …
Méthodes publiques
Close : Libère toutes les ressources associées au
processus
Kill : Arrête immédiatement le procesus associé.
Start : Lance une ressource processus. …
21 D. Bourget
Méthode : Start()
Start() est une méthode surchargée de la
classe "Process".
Méthodes statiques
public static Process Start(string);
• nom d'une application
public static Process Start(string, string);
• nom d'une application + arguments ligne de
commande
public static Process Start(ProcessStartInfo);
• le nom d'un document d'application
Méthode membre
public bool Start();
• Nécessite l'utilisation de la propriété "StartInfo"
22 D. Bourget
Page 11
Création d'un processus : version 1
23 D. Bourget
Résultat version 1
24 D. Bourget
Page 12
La propriété StartInfo
Arguments
Les arguments à passer à la commande
FileName
Nom du fichier
Verb
Commande à exécuter si c'est un fichier non
exécutable. Exemple" Print fic.txt". …
25 D. Bourget
26 D. Bourget
Page 13
Résultat version 2
27 D. Bourget
28 D. Bourget
Page 14
Résultat version 3
29 D. Bourget
Autres Exemples
Ouvrir un Navigateur
System.Diagnostics.Process.Start("http://www.enst-
bretagne.fr");
Ouvrir un gestionnaire de courrier
System.Diagnostics.Process.Start("mailto:Daniel.bourget
@enst-bretagne.fr");
30 D. Bourget
Page 15
La classe "ProcessStartInfo()"
Cette classe est souvent utilisée en même
temps que la classe "Process"
Elle permet l'accès à des informations sur le
processus, elle est beaucoup plus riche que
les informations associées à la propriété
"StartInfo" de la classe "Process".
Elle permet un meilleur contrôle sur le
processus démarré.
31 D. Bourget
ProcessStartInfo(String, String);
Le premier argument est identique à celui du
constructeur précédent
Le second argument précise le jeu d'arguments de
la ligne de commande à passer à l'application.
32 D. Bourget
Page 16
Propriétés de "ProcessStartInfo"
String Arguments
• Les arguments de la ligne de commande
Bool CreateNoWindows
• Exécution ou non du processus dans une autre
fenêtre
String Filename
• Nom de l'exécutable
ProcessWindowStyle WindowStyle
• Le style de la fenêtre (Hidden, Maximized, Minimized,
Normal)
String WorkingDirectory
• Le répertoire dans lequel sera démarré le processus
Etc etc
33 D. Bourget
34 D. Bourget
Page 17
Exemple
–
35 D. Bourget
Exemple (2)
Autre solution possible
Process p = new Process();
p.StartInfo = new ProcessStartInfo();
p.StartInfo.FileName = "NotePad.exe";
p.Start();
Encore d'autre possibilité
Process p = Process.Start("NotePad.exe");
36 D. Bourget
Page 18
Classe "Process" (suite)
Les informations associées à un processus
sont toujours liées à la propriété "StartInfo"
Attention cette propriété contient un objet de
type ProcessStartInfo
La méthode Start() de la classe "Process"
peut lever trois exceptions :
InvalidOperationException
Win32Exception
ObjectDisposeException
37 D. Bourget
Arrêter un processus
Il existe deux manières pour terminer un
processus
Kill()
CloseMainWindow()
La méthode Kill() a pour vocation d'arrêter
immédiatement un processus avec perte
éventuellement d'informations
p.Kill();
La méthode CloseMainWindow() arrête
proprement un processus en gérant notamment
tous les messages en attente
p. CloseMainWindow()
Attention ne pas confondre avec la méthode
Close() qui ne libère que les ressources
associées au processus
38 D. Bourget
Page 19
Arrêter un processus : principe
Pour arrêter un processus les actions
possibles à mettre en œuvre sont :
Appelez la méthode GetProcessesByName ou
GetProcessById pour récupérer le processus à
arrêter.
Appelez soit :
• CloseMainWindow
• Kill
Utiliser la propriété HasExited pour vérifier si le
processus associé à un Process est encore ou non
en exécution. Il est possible également d'utiliser
ExitTime qui donne l'heure à laquelle le processus
associé s'est terminé.
39 D. Bourget
40 D. Bourget
Page 20
Threads
Les threads
Les threads sont l'unité de base lors de
l'exécution d'un processus
Le CLR .NET est multi-threadé par défaut
(historique dans Windows NT)
Un processus peut créer un ou plusieurs
threads pour exécuter des portions de code
différents
Deux types de gestion des threads du
namespace System.Threading
Utilisation de la classe ThreadPool
• Ensemble restreint mais efficace
Utilisation de la classe Thread.
Il ne faut pas oublier que la majeure partie du
42 D. Bourget
temps un thread est en attente
Page 21
Les threads
Chaque thread gère
Un mécanisme d'exceptions
Une priorité de planification
Un ensemble de structures pour enregistrer le
contexte d’un thread.
Par définition le contexte d‘un thread
comprend:
Ensemble d’informations nécessaire à la reprise
d’exécution d’un thread
Le jeu des registres du CPU
La pile du thread
L’espace d'adressage du processus dont le thread
fait parti.
43 D. Bourget
Les threads
Les threads sont définis dans la classe
System.threading.Thread
Les priorités d'un threads sont :
Highest
AboveNormal
Normal
BelowNormal
Lowest
Fonctionnement :
Il est impossible de passer des paramètres au
démarrage d'un thread. On utilise les propriétés
pour lui envoyer des valeurs
44 D. Bourget
Page 22
Les threads : fonctionnement
Page 23
Inter threading
Il est plus simple d'utiliser les méthodes
statiques suivantes quand on n'a pas de
paramètre à passer
cas synchrone
– Control.Invoke(unDelegate, objet[], objet[])
Cas asynchrone
• Le couple
– Control.BeginInvoke(unDelegate)
Control.EndInvoke(IAsyncResult)
47 D. Bourget
InterThreading
using System.Windows;
using System.Threading;
namespace Wpf_Interthreading
{
/// Logique d'interaction pour MainWindow.xaml
public partial class MainWindow : Window
{
private Thread th;
private void LanceMethode()
{
textBox.Text = "Information";
}
public MainWindow()
{
th = new Thread(new ThreadStart(LanceMethode));
th.Start();
InitializeComponent();
}
}
}
48 D. Bourget
Page 24
Comment récupérer l’erreur
Modifier le type du projet
Mettre de type « Appplication Console »
49 D. Bourget
InterThreading : Solution 1
namespace Projet_45a
{
public partial class Form1 : Form {
private Thread th;
private delegate void leDelegate(string str);
public Form1() {
InitializeComponent();
th = new Thread(new ThreadStart(methodeThread));
th.Start();
InitializeComponent();
}
Page 25
Inter threading : solution 2
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;
namespace Projet_45 {
public partial class Form1 : Form {
private Thread th;
public Form1() {
th = new Thread(new ThreadStart(LanceMethode));
th.Start();
InitializeComponent();
}}}
51 D. Bourget
namespace Projet_45 {
public partial class Form1 : Form {
private Thread th;
public Form1() {
th = new Thread(new ThreadStart(() => LanceMethode("test"));
th.Start();
InitializeComponent();
}}}
52 D. Bourget
Page 26
Inter threading : autre solution
Background Worker
La classe "BackgroundWorker" permet d'exécuter
une opération sur un thread séparé
using System.ComponentModel;
//Définir un évènement
worker.DoWork += worker_DoWork;
53 D. Bourget
Background Worker
Description
3 attributs
• Stop manuel ?
• Donne l'avancement ?
• Attend d'être arrêté
3 méthodes
• RunAsync pour débuter,
• CancelAsync pour stopper,
• IsBusy pour savoir son état
4 événements
• La tâche,
• Le rapport de l’avancement de la tâche,
• La fin de la tâche,
• La libération du worker
54 D. Bourget
Page 27
Inter threading
Comment résoudre ce problème ?
Utilisation des délégations synchrones
ou asynchrones.
Intercepter les appels incorrects sur le thread
Control.CheckForIllegalCrossThreadCalls = false.
Attention cela ne fonctionne pas toujours et c’est
dangereux.
Les délégations synchrones et asynchrone
Délégation synchrone
• Control.Invoke(delegate, object[])
Délégation asynchrone
• Le couple : Control.BeginInvoke(delegate,object[]) /
Control.EndInvoke(IAsyncResult)
55 D. Bourget
Application Domaine
Le .NET Framework permet de diviser un
processus dans des sous processus
managés, nommés domaines d'applications
Un domaine d’application représente un
environnement isolé dans lequel s'exécute
les applications. La classe définissant ce
composant se nomme System.AppDomain.
Un ou plusieurs threads managés ont la
possibilité de s'exécuter dans un ou plusieurs
domaines d'applications et ceci à l’intérieur
d’un même processus non managé.
56 D. Bourget
Page 28
TreadSpool
Il n’est pas possible de gérer totalement le
contrôle de la vie d'un thread
Le système est omniprésent au niveau de la
gestion des threads
Les méthodes, uniquement statiques, de la
classe TreadSpool :
57 D. Bourget
Classe TreadSpool()
Les méthodes de la classe TreadSpool :
GetMAxThreads()
• Nombres maximum de requêtes en attente sur la file
d’attente
– public static void GetMaxThreads( out int workerThreads,
out int completionPortThreads );
GetAvailableThreads()
• Récupère le nombre de requêtes que l'on peut ajouter à la
file d'attente avant d'attendre GetMAxThreads()
– public static void GetAvailableThreads( out int
workerThreads, out int completionPortThreads );
58 D. Bourget
Page 29
Classe TreadSpool()
Les méthodes de la classe TreadSpool (suite)
QueueUserWorkItem()
• Ajout d'une nouvelle méthode dans la file d'attente. La
méthode s'exécute lorsqu'un thread du pool devient
disponible.
– public static bool QueueUserWorkItem( WaitCallback
callBack );
– public static bool QueueUserWorkItem( WaitCallback
callBack, object state );
• Attention il est obligatoire de définir la méthode
référencée comme
– Void laMéthodeRéférencée (object o)
RegisteredWaitHandle
• Gére les mécanismes de synchronisation
– Change notification, Console input, Event, Job, Memory
resource notification , Mutex, Process, Semaphore, Thread,
Waitable timer
– public static RegisteredWaitHandle
RegisterWaitForSingleObject( WaitHandle waitObject,
59 D. Bourget WaitOrTimerCallback callBack, object state, int
millisecondsTimeOutInterval, bool executeOnlyOnce );
La classe Thread()
Manipulation plus fine mais plus complexe des
threads
Création d'un thread
ThreadStart thd = new ThreadStart (uneMéthode);
Thread unThread = new Thread(thd);
void uneMéthode() { …..};
Attention un thread ayant fini son exécution se
termine normalement.
Stopper l'exécution d'un thread
unThread.Sleep(3000) /* 3 secondes */
Arrêter l'exécution d'un thread
unThread.Abort()
Etc etc
60 D. Bourget
Page 30
La classe Thread()
System.Threading.Thread
61 D. Bourget
Le constructeur de Thread()
Ce constructeur à pour but d’initialiser une nouvelle
instance de la classe Thread.
Attention l’argument du constructeur de cette classe
est de type ThreadStart
public Thread(TheardStart départ);
En fait TheardStart est un délégué qui spécifie la
méthode qui sera lancée lors de l’exécution du thread
public delegate void ThreadStart();
L'exécution du thread ne commence pas tant que la
méthode Start n'est pas appelée
Exception
ArgumentNullException
• Exception levée lorsqu'une référence null est passée à une
méthode
62 D. Bourget
Page 31
La classe Thread()
IsAlive (attribut)
Obtient une valeur indiquant l'état de l'exécution du
thread actuel
Abort (2 Surcharges)
public void Abort();
• Cette méthode déclenche ThreadAbortException dans le
thread ou abord apparaît.
• Attention cet appel de cette méthode arrête
généralement le thread.
63 D. Bourget
La classe Thread()
Join (3 Surcharges)
public bool Join();
• Bloque le thread appelant jusqu'à l'arrêt d'un thread.
• C’est-à-dire join() attend un tread pour terminer
public bool Join(int);
• Bloque le thread appelant jusqu'à l'arrêt d'un thread ou
l'écoulement de la durée spécifiée, en nombre de
millisecondes à attendre avant l'arrêt du thread.
Sleep (2 Surcharges, méthodes statiques)
static void Sleep(int);
• Bloque immédiatement le thread en cours pendant le
nombre spécifié de millisecondes.
Thread.Sleep(Timeout.Infinite)
• entraîne la mise en veille d'un thread jusqu'à son
interruption par un autre thread qui appelle
Thread.Interrupt ou jusqu'à son abandon par
Thread.Abort.
64 D. Bourget Un thread ne peut pas appeler Sleep sur
un autre thread
Page 32
La classe Thread()
Start
public void Start();
• Provoque le changement de l'instance en cours du
thread qui est dans l’état Running
Les exceptions levées
• ThreadStateException
– Le thread a déjà été démarré
• SecurityException
• OutOfMemoryException.
• NullReferenceException
Suspend Suspend
public void Suspend();
• Suspend le thread
• Cette méthode n’a aucun effet s'il est déjà
65 D. Bourget suspendu
66 D. Bourget
Page 33
Commentaires (1)
Style de programmation pour créer un thread :
1ère manière
2ième manière
67 D. Bourget
Autre exemple
68 D. Bourget
Page 34
IsAlive
Obtient une valeur indiquant l'état de l'exécution du
thread actuel.
Utilisation
while (!unThread.IsAlive);
L’utilisation de la méthode join() pour un thread
entraîne nécessairement une attente par le thread
principal d’un temps :
du à l'expiration de ce dernier
d'une durée spécifiée
69 D. Bourget
70 D. Bourget
Page 35
Interruption de thread
Un thread peut suspendre et reprendre
l'exécution d'un autre thread en utilisant les
méthodes suivantes :
SuspendThread
ResumeThread.
Attention ces deux méthodes ne peuvent pas
êtres utilisées comme points de
synchronisation.
Les deux appels à Sleep
Thread.Sleep (int temsMiliSeconce)
Thread.Sleep(Timeout.Infinite)
• Thread.Interrupt ou Thread.Abort.
71 D. Bourget
Interruption
Thread.Suspend.
Lorsqu'un thread appelle Thread.Suspend sur lui-même,
cet appel est bloquant jusqu'à ce que le thread soit repris
par un autre thread.
Lorsqu'un thread appelle Thread.Suspend sur un autre
thread, l'appel est à ce moment un appel non bloquant
mais entraîne la suspension de l'autre thread.
Thread.Resume
Reprend un thread qui a été suspendu
Ceci est indépendant du nombre d'appels à
Thread.Suspend qui a été réalisés sur l’objet.
72 D. Bourget
Page 36
Interruption
Le cas d'appel à Thread.Sleep(Timeout.Infinite)
Cet appel entraîne la mise en veille d'un thread jusqu'à
son interruption. Cette interruption par un autre thread
qui appelle Thread.Interrupt ou jusqu'à son abandon par
Thread.Abort.
Thread.Interrupt
Interrompt un thread dont l'état est WaitSleepJoin.
Cet appel interrompt donc l’attente d’un thread arrêté. Il
lève une exception ThreadInterruptedException dans le
thread de destination.
Thread.Abort
Déclenche l'exception ThreadAbortException sur le
thread.
73 D. Bourget
74 D. Bourget
Page 37
Les méthodes utiles
Généralement les méthodes que l'on utilisent le
plus souvent sont :
• Start(), Start(object obj) :
• Exécution asynchrone du thread•
Abort(), Abort(object obj) :
• Arrêt brutal d'un thread pour terminer de force un thread.
Join() :
• le thread T1 qui exécute T2.Join est bloqué jusqu'à la fin
de l’exécution de T2.
• Sleep(int n)
• le thread est suspendu n millisecondes.
75 D. Bourget
76 D. Bourget
Page 38
Class ReadWriterLock
Cette classe simplifie le mécanisme de
verrouillage d'objet
Liste des méthodes ::
AcquireReaderLock()
RealeaseReaderLock()
AcquireWriterLock()
ReleaseWriterLock()
77 D. Bourget
Exemple : ReaderWriterLock
namespace Projet_46
{
class Program
{
private static ReaderWriterLock rwl;
rwl.AcquireReaderLock(Timeout.Infinite);
rwl.ReleaseLock();
}}}
78 D. Bourget
Page 39
Les autres classes
Classe Interlocked
Utiliser pour simuler les sémaphores
InterlockedIncrement( ref i)
Classe Mutex
Mutex.WaitOne()
Mutex.Release()
Classe AutoResultEvent
Classe ManualResetEvent
Classe Monitor
BackgroundWorker
System.ComponentModel
79 D. Bourget
Classe Mutex
Permet de contrôler les accès aux sections
critiques pour une application donnée.
Ne pas confondre la clause lock avec les
objets instances de la classe Mutex
Les différences entre la clause lock et la
classe Mutex sont :
lock permet de la synchronisation des threads
d'une même application
• la classe Mutex permet la synchronisation des
threads de plusieurs applications.
80 D. Bourget
Page 40
La classe Mutex
Les méthodes les principales :
public bool WaitOne()
• Bloque le thread actuel jusqu'à ce que le Mutex actuel
reçoive un signal. Pour obtenir la documentation
complète, consultez la rubrique relative à la classe de
base, WaitHandle..::.WaitOne()()().
• (Substitue WaitHandle..::.WaitOne()()().) (origine MSDN)
ReleaseMutex()
• Libère une fois le Mutex.
81 D. Bourget
Classe AutoResetEvent
Définition :
Cette classe permet d'avertir un ou plusieurs
threads en attente qu'un événement s'est produit.
En fait il faut considérer que cette classe ne laisse
passer qu'un seul thread à la fois
Cette classe est de même catégorie que la classe
Mutex et la clause lock
82 D. Bourget
Page 41
Classe AutoResetEvent
Les méthodes (origine MSDN)
Set
• Définit l'état de l'événement comme étant signalé, ce
qui permet à un ou plusieurs threads en attente de
continuer.
Reset
• Définit l'état de l'événement comme étant non signalé,
entraînant le blocage des threads.
WaitOne
• Surchargé. En cas de substitution dans une classe
dérivée, bloque le thread en cours jusqu'à ce que le
WaitHandle en cours reçoive un signal.
83 D. Bourget
Page 42