Les Threads. Sommaire. 1 Les Threads

Dimension: px
Commencer à balayer dès la page:

Download "Les Threads. Sommaire. 1 Les Threads"

Transcription

1 1 Les Threads Les Threads Sommaire Les Threads Introduction Les Threads : Notions de base Créer un Thread avec une méthode non paramétrée Les threads à méthode paramétrée Gérer les arrêts des threads Contexte d'exécution des threads Gestion Multithread Première solution : La classe Interlocked Seconde solution : Verrouillage de bloc de code Verrouillage avancé : La classe Monitor Autres types de verrouillage La classe ReaderWriterLock La classe WaitHandle Une erreur fréquente de Multithreading : Les Deadlocks Les modèles de programmation asynchrone Modèles de programmation "Rendezvous" Le modèle Wait Until Done Le modèle Polling Le modèle Callback L'APM et les exceptions Premier outil des APM : La classe ThreadPool Utilisation standard du pooling de threads ThreadPool et WaitHandle Un autre outil des APM : La classe SynchronizationContext La classe Timer Conclusion... 53

2 2 Les Threads 1 Introduction Jusqu'ici, toutes les opérations étaient effectuées sur un seul processus : Celui de notre application. Ce type de programmation est très limité. En effet, si nous lançons une tâche lourde (comme le traitement d'une vidéo ou le rendu d'une image par exemple), nous ne pouvons rien faire d'autre qu'attendre que le processus soit terminé. Les Threads sont devenus indispensables aux développeurs souhaitant développer des applications performantes ; et cela est d'autant plus vrai depuis l avènement des processeurs multicœurs sur les machines. Ils permettent d effectuer des actions en parallèles dans une machine afin d en accélérer le traitement. Dans ce chapitre, nous allons voir comment le.net Framework nous permet de créer des processus (ou Thread) en plus du processus principal. Nous verrons également quels sont les moyens de gestion des threads puis nous verrons le concept d'application asynchrone. Tous les outils de gestion des processus se trouvent dans l'espace de nom System.Threading.

3 3 Les Threads 2 Les Threads : Notions de base La classe Thread nous permet de créer simplement un objet qui va exécuter le contenu d'une méthode. Les tableaux ci dessous en récapitulent les principaux membres et présentent également quelques énumérations utilisables avec cette classe : Membres d'instances Propriétés Description IsAlive Indique si le thread est en cours d exécution ou non. IsBackground Permet de savoir ou d indiquer si un thread tourne en arrière plan. IsThreadPoolThread Indique si le thread est dans le pool de threads. ManagedThreadId Retourne un nombre permettant d identifier le thread. Name Permet de connaitre ou d indiquer le nom du thread. Priority Permet de connaitre ou d indiquer une valeur de l énumération ThreadPriority indiquant la priorité du thread. ThreadState Retourne une des valeurs de l énumération ThreadState reflétant l état du thread. Méthodes Abort Interrupt Join Start Description Arrête l exécution du thread et lève une exception ThreadAbortException. Arrête l'exécution d'un thread dont l'état est WaitSleepJoin. Lève une exception ThreadInterruptedException. Bloque le thread appelant jusqu à ce que le thread ciblé se termine. Lance l'exécution d'un thread Membres statiques Propriétés Statiques Description CurrentContext Retourne un objet ThreadContext basé sur le thread courant. CurrentPrincipal Permet de connaitre ou d indiquer l utilisateur associé au thread courant. CurrentThread Retourne le thread en cours d exécution.

4 4 Les Threads Méthodes Statiques BeginCriticalRegion EndCriticalRegion GetDomain GetDomainID ResetAbort Sleep SpinWait VolatileRead VolatileWrite Description Entre ces deux méthodes, vous placez du code pouvant rendre le système instable. L hôte sur lequel est hébergé le thread va décider quoi faire pour ne pas rendre l application instable en cas d interruption du thread. Les régions critiques sont utiles lorsque plusieurs threads partagent des données. Retourne le domaine d'application associé au thread courant. Retourne un numéro d identification du domaine d'application associé au thread courant. Annule une requête d'arrêt pour le thread courant. Bloque le thread pendant un certain moment (en millisecondes). Passe la main aux autres threads. Bloque le thread pour un certain nombre d itérations mais ne passe pas la main aux autres threads. Lit la valeur d un champ dans sa version la plus récente, quelque soit le processeur ayant écrit la valeur. (Environnement Multiprocesseur) Ecrit une valeur dans un champ immédiatement de manière à ce qu elle soit accessible à tous les processeurs. (Environnement Multiprocesseur) Enumération ThreadState Valeur Description Aborted Le thread est interrompu AbortRequested Le thread à reçu une demande d interruption mais l exception ThreadAbortException n a pas encore été levée. Background Le thread tourne en arrière plan. Running Le thread est en cours d exécution Stopped Le thread est arrêté. StopRequested Le thread a reçu une demande d arrêt Unstarted Le thread a été crée mais n a pas encore était démarré. WaitSleepJoin Le thread est bloqué. (Par exemple par la méthode Join) Enumération ThreadPriority Valeur Highest Priorité la plus forte AboveNormal Entre Highest et Normal Normal Priorité par défaut BelowNormal Entre Normal et Lowest Lowest Priorité la moins forte Description

5 5 Les Threads 2.1 Créer un Thread avec une méthode non paramétrée Afin de créer un thread nous avons besoin d une méthode qui sera exécutée par le thread. Elle ne doit rien retourner et ne prendre aucun paramètre. Il nous faut également un délégué qui va se charger d exécuter la méthode au démarrage du thread et un objet thread afin de démarrer le thread: 'VB Public Sub affichage() For i As Integer = 0 To 5 Step 1 Console.WriteLine("Thread n 0 - Etat : 1", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState) Thread.Sleep(1000) Next Sub Main() Dim delegue As ThreadStart = New ThreadStart(AddressOf affichage) Dim monthread As Thread = New Thread(delegue) monthread.start() Console.Read() //C# static void affichage() Console.WriteLine("Thread n 0 - Etat : 1", Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.ThreadState); static void Main(string[] args) ThreadStart delegue = new ThreadStart(affichage); Thread monthread = new Thread(delegue); monthread.start(); Console.Read(); Thread n 11 Etat : Running Nous avons donc crée la fonction affichage, qui affiche le numéro du thread courant et son état. Ensuite dans la fonction main, nous créons un délégué de type ThreadStart qui pointe sur notre fonction affichage. Enfin nous créons notre thread prenant notre délégué en paramètre. Il nous suffit alors de démarrer le thread pour pouvoir afficher ses informations. Il faut bien comprendre que pendant que notre thread s exécute, nous pouvons effectuer d autres actions dans notre fonction main ; la fonction main étant elle même un processus.

6 6 Les Threads 'VB Public Sub affichage() For i As Integer = 0 To 5 Step 1 Console.WriteLine("Thread n 0 - Etat : 1", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState) Thread.Sleep(1000) Next Public Sub affichage2() Console.WriteLine("Second Thread est exécuté") Thread.Sleep(2000) Console.WriteLine("Second Thread se termine") Sub Main() Dim delegue As ThreadStart = New ThreadStart(AddressOf affichage) Dim monthread As Thread = New Thread(delegue) monthread.start() Dim delegue2 As ThreadStart = New ThreadStart(AddressOf affichage2) Dim monthread2 As Thread = New Thread(delegue2) monthread2.start() Console.Read() //C# static void affichage() for (int i = 0; i < 5; ++i) Console.WriteLine("Thread n 0 - Etat : 1", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.ThreadState); Thread.Sleep(1000); static void affichage2() Console.WriteLine("Second Thread est exécuté"); Thread.Sleep(2000); Console.WriteLine("Second Thread se termine"); static void Main(string[] args) ThreadStart delegue = new ThreadStart(affichage); Thread monthread = new Thread(delegue); monthread.start(); ThreadStart delegue2 = new ThreadStart(affichage2); Thread monthread2 = new Thread(delegue2); monthread2.start(); Console.Read();

7 7 Les Threads Nous avons donc crée deux threads. Chacun va effectuer un traitement différent, plus ou moins long et simulé par des pauses : Le premier effectue une boucle de cinq itérations où il affiche ses informations et fait une pause d une seconde. Le second affiche qu il débute, fait une pause de deux secondes puis affiche qu il se termine. Thread n 10 Etat : Running Second Thread est exécuté Thread n 10 Etat : Running Thread n 10 Etat : Running Second Thread se termine Thread n 10 Etat : Running Thread n 10 Etat : Running Si on regarde le résultat on voit que le premier thread démarre suivit immédiatement par le second. Puis, deux boucles du premier thread (2 secondes) sont passées et le second thread se termine. Le second thread a donc bien attendu 2 secondes avant de reprendre son déroulement, tout en laissant l autre thread continuer d itérer. Il se peut que dans certains cas vous deviez attendre qu un autre thread termine son traitement avant de continuer. Que ce soit le thread principal de votre fonction Main, ou un autre. Pour cela on utilise la méthode Join. La méthode Join va bloquer le thread dans lequel elle a été appelée, jusqu'à ce que le thread ciblé ait fini son exécution.

8 8 Les Threads Reprenons le code précédent et rajoutons monthread.join() : 'VB Sub Main() Dim delegue As ThreadStart = New ThreadStart(AddressOf affichage) Dim monthread As Thread = New Thread(delegue) monthread.start() monthread.join() Dim delegue2 As ThreadStart = New ThreadStart(AddressOf affichage2) Dim monthread2 As Thread = New Thread(delegue2) monthread2.start() Console.Read() //C# static void Main(string[] args) ThreadStart delegue = new ThreadStart(affichage); Thread monthread = new Thread(delegue); monthread.start(); monthread.join(); ThreadStart delegue2 = new ThreadStart(affichage2); Thread monthread2 = new Thread(delegue2); monthread2.start(); Console.Read(); Thread n 10 Etat : Running Thread n 10 Etat : Running Thread n 10 Etat : Running Thread n 10 Etat : Running Thread n 10 Etat : Running Second Thread est exécuté Second Thread se termine Cette fois ci, nous pouvons remarquer que le premier thread est lancé et stop le processus principal jusqu'à ce qu'il ait finit son exécution. Ainsi, le second thread n'est jamais démarré tant que le premier thread n'a pas réalisé ses 5 itérations.

9 9 Les Threads 2.2 Les threads à méthode paramétrée Les threads que nous avons vus jusqu à présent étaient simples et leurs méthodes exécutées ne comportaient pas de paramètres. Cependant, vous pouvez passer un paramètre à la fonction sur laquelle pointe le délégué. Pour cela, vous devez utiliser un délégué de type ParameterizedThreadStart au lieu de ThreadStart. Une seule contrainte à cela : le paramètre doit être obligatoirement un objet de type Object : 'VB Public Sub affichage3(byval o As Object) Console.WriteLine("0", CType(o, String)) Sub Main() Dim delegue_parametres As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf affichage3) Dim monthread3 As Thread = New Thread(delegue_parametres) monthread3.start("coucou") Console.Read() //C# static void affichage3(object o) Console.WriteLine("0", (string)o); static void Main(string[] args) ParameterizedThreadStart delegue_parametres = new ParameterizedThreadStart(affichage3); Thread monthread3 = new Thread(delegue_parametres); monthread3.start("coucou"); Console.Read(); Coucou

10 10 Les Threads 2.3 Gérer les arrêts des threads Pour arrêter un thread, il faut utiliser la méthode Abort. Celle ci va stopper le processus ciblé et va envoyer une exception ThreadAbortException. Cette exception peut ne pas être gérée par le code, cela n'interrompra pas le programme. Elle est juste levée pour signaler que le thread se termine. 'VB Public Sub maliste(byval o As Object) Dim liste As List(Of String) = CType(o, List(Of String)) For i As Integer = 0 To Step 1 liste.add("test") Next Sub Main() Dim liste As List(Of String) = New List(Of String)() Dim delegue_parametres2 As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf maliste) Dim monthread4 As Thread = New Thread(delegue_parametres2) monthread4.start(liste) Console.WriteLine("0", liste.count) Console.WriteLine("0", liste.count) monthread4.abort() monthread4.join() Console.WriteLine("0", liste.count) //C# static void maliste(object o) List<string> liste = o as List<string>; for (int i = 0; i < ; i++) liste.add("test"); static void Main(string[] args) List<string> liste = new List<string>(); ParameterizedThreadStart delegue_parametres2 = new ParameterizedThreadStart(maListe); Thread monthread4 = new Thread(delegue_parametres2); monthread4.start(liste); Console.WriteLine("0", liste.count); Console.WriteLine("0", liste.count); monthread4.abort(); monthread4.join(); Console.WriteLine("0", liste.count); Console.Read(); Dans ce code, nous chargeons notre thread de rajouter dans une liste dix millions de fois le mot "Test" et nous affichons périodiquement la taille de la liste afin de voir où en est le traitement.

11 11 Les Threads Au final nous utilisons la méthode Join pour que le thread termine proprement son travail. Nous exécutons d abord notre code en mettant en commentaire la ligne monthread4.abort(); : puis, nous dé commentons ensuite la ligne: Comme vous pouvez le voir, le thread a été interrompu en cours de traitement car il n a pas pu terminer la boucle dans laquelle il était. La méthode Join ne sert plus à grand chose. Il faut faire attention à la méthode Abort. En effet, celle ci peut arrêter le thread à n importe quel moment du thread et dans certains cas, rendre l application instable. Dans le cas d applications complexes ou plusieurs threads partagent les mêmes données, il faudra utiliser les régions critiques afin que l application ne devienne pas instable. Pour cela, vous déclarez une région critique de code avec la méthode BeginCriticalRegion. Ensuite vous placez le code que vous estimez critique et vous terminez la région avec la méthode EndCriticalRegion. Je vous invite à lire à nouveau le tableau des méthodes statiques de la partie 2 pour avoir une description des zones critiques.

12 12 Les Threads 2.4 Contexte d'exécution des threads Tout comme pour la sérialisation, chaque thread possède un contexte d exécution propre, définissant par exemple des informations de sécurités. Vous pouvez manipuler le flux contenant le contexte en utilisant les membres statiques de la classe ExecutionContext. Le contexte d exécution va vous permettre d échanger des données entre threads de manière sécurisée et intègre. Si vous souhaitez utiliser des threads sans contexte particulier, vous devrez utiliser la méthode SuppressFlow. Stopper le flux permet de gagner en performances, en contre partie nous perdons les informations de sécurité, de culture et le contexte de transaction. 'VB Sub Main() Dim flow As AsyncFlowControl = ExecutionContext.SuppressFlow() Dim monthread5 As Thread = New Thread(New ThreadStart(AddressOf affichage2)) monthread5.start() monthread5.join() Console.Read() //C# static void Main(string[] args) AsyncFlowControl flow = ExecutionContext.SuppressFlow(); Thread monthread5 = new Thread(new ThreadStart(affichage2)); monthread5.start(); monthread5.join(); Console.Read(); Ici nous avons supprimé le flux et nous lançons notre Thread normalement. Remarquez que nous avons imbriqué le délégué directement en paramètre de Thread.

13 13 Les Threads Si vous voulez restaurez finalement le contexte, vous pouvez utiliser RestoreFlow ou la méthode Undo de l'objet AsyncFlowControl (ici, l'objet flow): 'VB Sub Main() Dim flow As AsyncFlowControl = ExecutionContext.SuppressFlow() Dim monthread5 As Thread = New Thread(New ThreadStart(AddressOf affichage2)) monthread5.start() monthread5.join() ExecutionContext.RestoreFlow() Console.Read() //C# static void Main(string[] args) AsyncFlowControl flow = ExecutionContext.SuppressFlow(); Thread monthread5 = new Thread(new ThreadStart(affichage2)); monthread5.start(); monthread5.join(); ExecutionContext.RestoreFlow(); Console.Read(); Une fois que notre thread à terminé, nous restaurons le contexte d'exécution pour les autres threads. Vous pouvez enfin utiliser la méthode Run afin de créer et modifier le contexte d'exécution: 'VB Sub Main() Dim contexte As ExecutionContext = ExecutionContext.Capture() ExecutionContext.Run(contexte, New ContextCallback(AddressOf ContexteAppele), Nothing) //C# static void Main(string[] args) ExecutionContext contexte = ExecutionContext.Capture(); ExecutionContext.Run(contexte, new ContextCallback(ContexteAppele), null); Nous récupérons le contexte actuel avec la méthode Capture de ExecutionContext, puis avec la méthode Run nous passons en premier paramètre la référence au nouveau contexte, en second paramètre un délégué pointant sur une méthode ContexteAppele à exécuter dans le contexte fourni, et un l'objet qui sera passé en paramètre de la méthode exécutée (ici, aucun objet est utilisé). La méthode ContexteAppele est une simple fonction qui ne retourne rien et prend une variable de type Object en unique paramètre.

14 14 Les Threads 3 Gestion Multithread Dans un environnement multithread, nous pouvons arriver dans le cas où plusieurs Threads cherchent à accéder aux mêmes données. Considérons le code suivant : 'VB Dim threada, threadb As Thread Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To CType(o, Value).value += 1 Next Thread.CurrentThread.Abort(Nothing) Sub Main() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

15 15 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static void methode(object o) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) ((Value)o).value += 1; Thread.CurrentThread.Abort(null); static void Main(string[] args) Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Si nous interprétons ce code, nous créons un objet nommé "v" contenant une valeur unique. Nous créons également deux threads ainsi qu'une seule méthode à exécuter. Dans cette méthode, nous incrémentons la valeur contenue dans notre objet. Or à l'exécution du programme : ID : 10 dispose de 0 ID : 11 dispose de On remarque que, suite à l'exécution des deux threads le résultat est différent de comme on aurait pu le prévoir. Cela est dû au fait que les processeurs actuels réalisent les opérations en plusieurs étapes. Si on décrit grossièrement les étapes, ils chargent la donnée à modifier dans leur mémoire interne (mémoire cache), puis ils effectuent l'opération désirée et enfin, ils stockent dans la mémoire vive la valeur issue du calcul. Seulement, ces mêmes processeurs sont en général équipés de circuits de traitements permettant à plusieurs processus de s'exécuter (a quelques intervalles près) en même temps.

16 16 Les Threads Le schéma ci dessous reprend ce principe d'exécution simultanée : Dans ce schéma, chacun de nos threads est représenté par une couleur. Cette couleur est réutilisée dans la colonne de droite pour spécifier quel thread a modifié la valeur de V en mémoire. Dans le détail de l'exécution du processeur : Les cases rouges représentent l'opération de copie de la donnée à modifier (de la mémoire vive vers la mémoire cache du CPU). Les cases vertes représentent l'opération à effectuer (ici une incrémentation). Les cases bleues représentent l'opération inverse aux cases rouge (copie de la donnée de la mémoire cache du CPU vers la mémoire vive) Dans tous les cas, une référence de temps est présentée par "T0", "T1",. Au final, ce schéma montre bien que, même si les deux threads se sont exécutés, la valeur n'aura été incrémentée que de 1 alors qu'on aurait voulu qu'elle soit incrémentée de 2. Note : Ce procédé d'exécution simultanée est réalisé grâce au principe de Pipelining (comprenez "ligne d'exécution"). Si vous souhaitez en apprendre d'avantage sur le Multithread et le pipelining, je vous recommande ce premier lien ainsi que celui sur les pipelines. Et ça ne s'arrête pas là. En effet, en plus du problème de multithreading, les ordinateurs actuels disposent de techniques permettant à plusieurs threads de fonctionner sur une seule ligne d'exécution (En donnant un temps d'accès CPU limité à chaque thread) : Le Multithreading simultané. Cela veut dire que, par exemple, le ThreadA pourrait être interrompu par l'hôte avant qu'il n'ait eu le temps de copier la valeur de la mémoire cache vers la mémoire vive, laissant ainsi au ThreadB la valeur initiale de "v" à savoir 0.

17 17 Les Threads 3.1 Première solution : La classe Interlocked Cette classe donne accès à des méthodes statiques permettant d'indiquer au système d'exploitation qu'une donnée ne peut pas être modifiée par deux threads en même temps, tant que le thread qui a récupéré la donnée n'a pas fini son opération. Elles interdisent également à l'hôte d'interrompre un processus prématurément afin de donner la main à un autre processus. Voici les principales méthodes de cette classe : Méthode Description Add Ajoute deux entiers entre eux et remplace le premier entier par le résultat, le tout en une opération atomique. Decrement Décrémente de 1 la valeur passée en paramètre en réalisant une opération atomique. Exchange Echange le contenu de deux objets en effectuant une opération atomique. Increment Incrémente de 1 la valeur passée en paramètre en réalisant une opération atomique. Read Retourne un entier codé sur 64bits en effectuant une opération atomique. Note : Une opération atomique est une opération qui ne peut pas être interrompue. Ainsi, nous pourrions remplacer la ligne d'incrémentation de la valeur par la méthode Increment :

18 18 Les Threads 'VB Dim threada, threadb As Thread Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) Next Thread.CurrentThread.Abort(Nothing) Sub Main() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

19 19 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static void methode(object o) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); Thread.CurrentThread.Abort(null); static void Main(string[] args) Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Si nous reprenons le schéma du dessus en le modifiant : Ainsi, le schéma nous montre clairement que cette fois ci, le ThreadB doit attendre que le ThreadA ait fini son opération pour avoir accès à la donnée à modifier.

20 20 Les Threads Note : Ne pensez pas que ce procédé vous fait perdre des performances. En effet, les processeurs possèdent bien plus de deux lignes d'exécution et les systèmes d'exploitation s'arrangent pour que chaque ligne soit occupée dans le bon ordre. Ainsi, si notre ThreadB se trouve sur la troisième ligne d'exécution au lieu de la seconde, le système d'exploitation va en fait occuper la seconde ligne d'exécution avec un autre Thread. Peu importe votre type de processeur, le résultat restera cette fois ci toujours le même : ID : 10 dispose de 0 ID : 11 dispose de Vous pouvez également constater que le problème n'est que partiellement résolu. En effet, au démarrage des deux threads, ceux ci ont encore pour valeur initiale le 0 de départ de notre valeur. Le problème se résout uniquement lorsque l'un des deux threads à finit d'incrémenter la valeur.

21 21 Les Threads 3.2 Seconde solution : Verrouillage de bloc de code La classe Interlocked est utile si vous n'effectuez que des petits traitements. Elle devient dépassée si vous travaillez sur des objets plus complexes. Aussi, le.net Framework propose une autre solution pour verrouiller les données : Les mots clés lock en C# et SyncLock en VB.NET. Si nous reprenons le code précédent en apportant les modifications nécessaire : 'VB Dim threada, threadb As Thread Public Class Value Public value As Integer End Class Sub methode(byval o As Object) SyncLock o Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To CType(o, Value).value += 1 Next Thread.CurrentThread.Abort(Nothing) End SyncLock Sub Main() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

22 22 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static void methode(object o) lock (o) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) ((Value)o).value += 1; Thread.CurrentThread.Abort(null); static void Main(string[] args) Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Nous obtenons à la compilation : ID : 11 dispose de 0 ID : 10 dispose de A l'image de Interlocked, la valeur utilisée est donc verrouillée sauf que cette fois ci, elle reste verrouillée tant que tout le code de la méthode à exécuter n'a pas été exécuté. Cela se remarque car le premier thread dispose de la valeur initiale 0 alors que le second thread démarre à Grâce à ces mots clés, nous ne verrouillons plus de valeur unique mais des portions de code.

23 23 Les Threads 3.3 Verrouillage avancé : La classe Monitor La classe Monitor propose un ensemble de méthodes statiques pour verrouiller des portions de code de façon un peu plus construite. Voici les principales méthodes : Méthode Description Enter Fourni un verrouillage sur l'objet passé en paramètre. TryEnter Tente de créer un verrouillage sur l'objet passé en paramètre. Peut également fournir un verrouillage avec une limite de temps. Exit Déverrouille l'objet passé en paramètre Wait Déverrouille l'objet passé en paramètre et endort le thread jusqu'à ce qu'il puisse a nouveau obtenir un verrouillage sur l'objet. Si nous reprenons le code précédent : 'VB Dim threada, threadb As Thread Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Monitor.Enter(o) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) If (i = 1) Then Monitor.Exit(o) End If Next Thread.CurrentThread.Abort(Nothing) Sub Main() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

24 24 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static void methode(object o) Monitor.Enter(o); Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); if(i == 1) Monitor.Exit(o); Thread.CurrentThread.Abort(null); static void Main(string[] args) Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); A l'exécution, nous devrions obtenir un résultat similaire à celui ci : ID : 10 dispose de 0 ID : 11 dispose de Le ThreadA démarre et verrouille l'objet au début de son exécution. Ensuite, le ThreadB démarre à son tour et voit son exécution bloquée tant que le ThreadA n'a pas atteint la ligne "Monitor.exit(o)". Pour l'incrémentation, nous utilisons toujours Interlocked car une fois que le ThreadA a débloqué l'objet, les deux threads peuvent de nouveau accéder à la même donnée. Le ThreadB commence avec une valeur différente de 1 tout simplement car le temps qu'il sorte de sa mise en veille, le ThreadA à eu le temps d'effectuer plusieurs incrémentations atomiques verrouillant l'objet à incrémenter. Note : Si votre processeur est plus puissant que celui qui a été utilisé pour cet exemple, il est fort possible que vous obteniez une valeur de démarrage du ThreadB plus élevée. Il est également possible que la valeur de démarrage utilisée par le ThreadB soit de 1 si vous avez beaucoup de chance!

25 25 Les Threads 3.4 Autres types de verrouillage La classe ReaderWriterLock Cette classe permet de gérer deux types de verrouillage : Les verrouillages en écriture et les verrouillages en lecture. Tout objet verrouillé en lecture par un thread, devra être déverrouillé avant qu'un autre thread, cherchant à verrouiller le même objet en écriture, puisse obtenir son verrouillage. Il est tout à fait possible que plusieurs threads différents puissent obtenir un verrouillage en lecture sur un seul et même objet. Il faut également retenir que s'il est possible d'obtenir plusieurs verrouillages en lecture, il est impossible que plusieurs threads obtiennent un verrouillage en écriture. En voici les principales propriétés (en vert) et méthodes(en bleu) de cette classe : Membres Description IsReaderLockHeld Indique si un verrou de lecture est actuellement en place. IsWriterLockHeld Indique si un verrou d'écriture est actuellement en place. AcquireReaderLock Tente d'obtenir un verrouillage de lecture pendant un temps donné. Si au bout du temps spécifié, aucun verrou n'a été créé, une exception sera levée. AcquireWriterLock Identique à AcquireReaderLock mais pour placer un verrou en écriture. DowngradeFromWriterLock Convertit un verrou d'écriture en un verrou de lecture. ReleaseReaderLock Supprime un verrou en lecture d'un objet. ReleaseWriterLock Supprime un verrou en écriture d'un objet. UpgradeToWriterLock Convertit un verrou de lecture en un verrou d'écriture. En reprenant notre code, l'exemple ci dessous tente de verrouiller nos deux threads en écriture. Si le premier verrouillage est un succès, le second échouera :

26 26 Les Threads 'VB Dim threada, threadb As Thread Dim locker As ReaderWriterLock Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Try locker.acquirewriterlock(1) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) If (i = 1) Then locker.releasewriterlock() End If Next Catch ex As Exception Console.WriteLine("Verrouillage du thread 0 en écriture impossible", Thread.CurrentThread.ManagedThreadId) End Try Thread.CurrentThread.Abort(Nothing) Sub Main() locker = New ReaderWriterLock() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

27 27 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static ReaderWriterLock locker; public static void methode(object o) try locker.acquirewriterlock(1); Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); if(i == 1) locker.releasewriterlock(); catch(exception ex) Console.WriteLine("Verrouillage du thread 0 en écriture impossible", Thread.CurrentThread.ManagedThreadId); Thread.CurrentThread.Abort(null); static void Main(string[] args) locker = new ReaderWriterLock(); Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); ID : 11 dispose de 0 Verrouillage du thread 12 en écriture impossible

28 28 Les Threads La classe WaitHandle Cette classe abstraite fourni aux classes qui en hérite un système permettant de spécifier le blocage ou la libération de ressources partagées. Voici les principaux membres : Membres Description Handle Obtient ou définit un pointeur vers les ressources à verrouiller. Important : Cette propriété est dépréciée, utilisez la propriété SafeWaitHandle à la place. Close Permet de libérer l'objet verrouillé. WaitOne Bloque le thread courant jusqu'à ce que l'objet Handle reçoive un signal de libération. Le.NET Framework propose de base quelques classes qui héritent de WaitHandle La classe Mutex Cette classe fonctionne de la même façon que la classe Monitor. Son avantage est qu'elle peut également fournir des verrous sur des ressources partagées en dehors du domaine d'application. Elle propose, en plus des méthodes de sa classe parente, la méthode ReleaseMutex afin de supprimer le verrou de la ressource. Elle dispose également de la méthode statique OpenExisting qui permet de charger un objet Mutex créé en dehors du domaine d'application courant et nommé via sa propriété Name.

29 29 Les Threads 'VB Dim threada, threadb As Thread Dim locker As Mutex Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Try If (locker.waitone(1, False)) Then Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) Next locker.releasemutex() Thread.CurrentThread.Abort(Nothing) Else Console.WriteLine("Thread 0 mis en attente", Thread.CurrentThread.ManagedThreadId) End If Catch ex As Exception Console.WriteLine(ex.Message) End Try Sub Main() locker = New Mutex() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

30 30 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static Mutex locker; public static void methode(object o) try if(locker.waitone(1, false)) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); locker.releasemutex(); Thread.CurrentThread.Abort(null); else Console.WriteLine("Thread 0 mis en attente", Thread.CurrentThread.ManagedThreadId); catch(exception ex) Console.WriteLine(ex.Message); static void Main(string[] args) locker = new Mutex(); Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Ce code va fourni un verrou sur le premier thread à accéder à la méthode d'exécution. Seulement, lorsque le second thread va tenter d'obtenir un verrou, il sera mis en attente un temps trop court (1 milliseconde) pour qu'il puisse être exécuté. ID : 12 dispose de 0 Thread 13 mis en attente Le thread a été abandonné

31 31 Les Threads La classe Semaphore Cette classe permet de bloquer une ressource après un certain nombre d'accès. C'est un peu l'équivalent des "slots" sur les serveurs de jeu : La classe Semaphore couplée à une ressource constitue le serveur et les threads représentent les joueurs. Dès qu'il n'y a plus de place disponible sur le serveur, les joueurs sont éjectés ce qui est équivalent à dire que dès que la classe Semaphore n'a plus de place disponible, les threads tentant d'accéder à la ressource seront bloqués jusqu'à ce que la ressource soit libérée. Tout comme Mutex, elle peut être nommée pour être chargée dans un autre domaine d'application. 'VB Dim threada, threadb As Thread Dim locker As Semaphore Public Class Value Public value As Integer End Class Sub methode(byval o As Object) While (Thread.CurrentThread.IsAlive) Try If (locker.waitone(1, False)) Then Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) Next locker.release(1) Thread.CurrentThread.Abort(Nothing) Else Console.WriteLine("Thread 0 mis en attente", Thread.CurrentThread.ManagedThreadId) End If Catch ex As Exception Console.WriteLine(ex.Message) End Try End While Sub Main() locker = New Semaphore(1,1) Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

32 32 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static Semaphore locker; public static void methode(object o) while(thread.currentthread.isalive) try if(locker.waitone(1, false)) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); locker.release(1); Thread.CurrentThread.Abort(null); else Console.WriteLine("Thread 0 mis en attente", Thread.CurrentThread.ManagedThreadId); catch(exception ex) Console.WriteLine(ex.Message); static void Main(string[] args) locker = new Semaphore(1,1); Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read();

33 33 Les Threads Ce code n'autorise qu'un seul verrouillage à la fois et par un seul thread. Autrement dit, le second thread devra attendre que le premier libère la ressource avant de pouvoir se lancer. ID : 12 dispose de 0 Thread 13 mis en attente Thread 13 mis en attente ID : 13 dispose de Le thread a été abandonné. Le thread a été abandonné

34 34 Les Threads Les verrouillages évènementiels Les classes AutoResetEvent et ManualResetEvent héritent toutes les deux de EventWaitHandle qui hérite elle même de WaitHandle. La classe EventWaitHandle fourni deux méthodes Set et Reset permettant respectivement d'activer et de désactiver le verrouillage des threads. En gros, ces classes permettent juste d'activer ou non l'accès à des ressources. La différence entre les deux est que AutoResetEvent va retourner automatiquement à son état de verrou actif après désactivation du verrou. Tout comme les deux autres objets de verrouillage Semaphore et Mutex, ils peuvent également être nommés pour être chargés en dehors du domaine d'application. 'VB Dim threada, threadb As Thread Dim locker As AutoResetEvent Public Class Value Public value As Integer End Class Sub methode(byval o As Object) While (Thread.CurrentThread.IsAlive) If (locker.waitone(500, False)) Then Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) Next locker.set() Thread.CurrentThread.Abort(Nothing) Else Console.WriteLine("Le thread 0 a été endormi!", Thread.CurrentThread.ManagedThreadId) End If End While Sub Main() locker = New AutoResetEvent(False) Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) Thread.Sleep(2000) locker.set() threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

35 35 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static AutoResetEvent locker; public static void methode(object o) while(thread.currentthread.isalive) if(locker.waitone(500, false)) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for (int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); locker.set(); Thread.CurrentThread.Abort(null); else Console.WriteLine("Le thread 0 a été endormi!", Thread.CurrentThread.ManagedThreadId); static void Main(string[] args) locker = new AutoResetEvent(false); Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); Thread.Sleep(2000); locker.set(); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Ce code va bloquer l'exécution des deux processus pendant 2 secondes. Ces deux processus seront endormis pendant 500ms avant de re tester s'ils peuvent accéder aux ressources. Le thread 12 a été endormi! Le thread 11 a été endormi! Le thread 11 a été endormi! Le thread 12 a été endormi! Le thread 11 a été endormi! Le thread 12 a été endormi! ID : 11 dispose de 0 Le thread 12 a été endormi! ID : 12 dispose de

36 36 Les Threads 3.5 Une erreur fréquente de Multithreading : Les Deadlocks A l'image des fameux BSoD (Blue Screen of Death) de Windows, le développement d'application multithread met en avant les deadlocks. Traduit littéralement, cela voudrait dire "Verrouillage mort". Les deadlocks, c'est le fait de faire verrouiller un ou plusieurs objets par plusieurs threads sans jamais leur donner la possibilité de déverrouiller l'objet. Le code se trouve dans un cas d'exécution bloquée où les threads ne peuvent plus rien faire car ils verrouillent tous l'objet, empêchant ainsi les autres threads de s'exécuter et réciproquement. 'VB Dim threada, threadb As Thread Public Class Value Public value As Integer End Class Sub methode(byval o As Object) Monitor.Enter(o) Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, CType(o, Value).value) For i As Integer = 1 To Interlocked.Increment(CType(o, Value).value) If (i = 1) Then Monitor.Exit(o) End If Next Thread.CurrentThread.Abort(Nothing) Sub Main() Dim v As Value = New Value() v.value = 0 Dim operation As ParameterizedThreadStart = New ParameterizedThreadStart(AddressOf methode) threada = New Thread(operation) threadb = New Thread(operation) threada.start(v) threadb.start(v) Monitor.Enter(v) threada.join() threadb.join() Console.WriteLine(v.value) Console.Read()

37 37 Les Threads //C# public class Value public int value; public static Thread threada, threadb; public static void methode(object o) Monitor.Enter(o); Console.WriteLine("ID : 0 dispose de 1", Thread.CurrentThread.ManagedThreadId, ((Value)o).value); for(int i = 0; i < ; i++) Interlocked.Increment(ref ((Value) o).value); if(i == 1) Monitor.Exit(o); Thread.CurrentThread.Abort(null); static void Main(string[] args) Value v = new Value(); v.value = 0; ParameterizedThreadStart operation = new ParameterizedThreadStart(methode); threada = new Thread(operation); threadb = new Thread(operation); threada.start(v); threadb.start(v); Monitor.Enter(v); threada.join(); threadb.join(); Console.WriteLine(v.value); Console.Read(); Si nous compilons ce programme, l'exécution de celui ci se bloque au début de l'exécution du ThreadA. En effet, dès que les deux threads ont démarré, le thread principal de l'application verrouille l'objet puis ce même thread attend que les deux autres threads aient fini leur tache ; tache qui ne peut plus avancer puisque l'objet sur lequel ils travaillent, est verrouillé par le processus principal : L'application est "plantée".

38 38 Les Threads 4 Les modèles de programmation asynchrone Le modèle de programmation asynchrone (APM pour Asynchronous Programming Model) permet d effectuer des traitements dans un thread sans pour autant bloquer les autres threads. En effet jusqu à présent, nous utilisions les threads afin d effectuer des opérations en parallèle, mais en fait, chaque Thread se contentait de bloquer les autres processus pour effectuer son traitement puis passait la main au thread suivant. On utilise l APM le plus souvent pour les traitements lourds ou longs (ouverture de fichiers, connexion distante (à une base de données ou une autre machine)), afin de pouvoir continuer à faire tourner l application pendant que la méthode asynchrone s exécute. Cela va nous permettre par exemple dans le cas d un jeu vidéo en ligne de rechercher un serveur tout en continuant le programme principal (gestion de la musique, des évènements, de l affichage ). Dans le Framework.NET, de nombreuses classes supportent l APM grâce à des méthodes particulières. Souvent ces méthodes ressemblent à leur version non asynchrone et sont précédées des mots Begin ou End (par exemple, la classe FileStream possède un équivalent asynchrone à la méthode Read : BeginRead et EndRead). Vous pouvez aussi rendre asynchrone vos propres méthodes en utilisant les méthodes BeginInvoke et EndInvoke associées au délégué pointant vers la méthode à exécuter. Pour mieux comprendre nous allons utiliser BeginInvoke et EndInvoke. Sachez que si vous souhaitez utiliser une méthode asynchrone déjà implémentée, le code sera sensiblement identique. BeginInvoke et EndInvoke sont des méthodes d un délégué asynchrone dont la signature est la même que la méthode que vous allez appeler. Quand vous avez crée et instancié votre délégué, vous allez pouvoir initier l appel de votre méthode de manière asynchrone grâce à BeginInvoke. La méthode BeginInvoke utilise les mêmes paramètres que la méthode appelée suivit de deux paramètres optionnels : Un délégué AsyncCallback qui pointe sur une méthode à appeler lorsque l appel asynchrone se termine. Un objet qui vous permet de passer des données à la méthode exécutée par le délégué. La méthode EndInvoke permet de fermer l appel à la méthode. Veillez à bien l appeler dans vos programmes. Si vous utilisez EndInvoke avant que l appel à la méthode soit terminé, EndInvoke va bloquer les autres threads jusqu à que l appel se termine. Voici un exemple d utilisation de BeginInvoke et EndInvoke :

39 39 Les Threads 'VB Public Delegate Function AsyncAppelMethode(ByVal tempsattente As Integer, ByRef idthread As Integer) As String Public Class AsyncAffichage Public Function mamethode(byval tempsattente As Integer, ByRef idthread As Integer) As String Console.WriteLine("Début de la méthode, veuillez patienter") Thread.Sleep(tempsAttente) idthread = Thread.CurrentThread.ManagedThreadId Return String.Format("Cet affichage a eu lieu après une attente de 0 millieme de secondes", tempsattente.tostring()) End Function End Class Sub Main() Dim idthread As Integer Dim a As Integer = 0 Dim affichage As AsyncAffichage = New AsyncAffichage() Dim appel As AsyncAppelMethode = New AsyncAppelMethode(AddressOf affichage.mamethode) Dim resultat As IAsyncResult = appel.begininvoke(10000, idthread, Nothing, Nothing) For i As Integer = 1 To Step 1 a += 1 Next Console.WriteLine("0", a) Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode") Dim valeurderetour As String = appel.endinvoke(idthread, resultat) Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour) Console.Read()

40 40 Les Threads //C# public delegate string AsyncAppelMethode(int tempsattente, out int idthread); public class AsyncAffichage public string mamethode(int tempsattente, out int idthread) Console.WriteLine("Début de la méthode, veuillez patienter"); Thread.Sleep(tempsAttente); idthread = Thread.CurrentThread.ManagedThreadId; return String.Format("Cet affichage a eu lieu après une attente de 0 millieme de secondes", tempsattente.tostring()); static void Main(string[] args) int idthread; int a = 0; AsyncAffichage affichage = new AsyncAffichage(); AsyncAppelMethode appel = new AsyncAppelMethode(affichage.maMethode); IAsyncResult resultat = appel.begininvoke(10000, out idthread, null, null); for (int i = 0; i < ; i++) a++; Console.WriteLine("0", a); Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode"); string valeurderetour = appel.endinvoke(out idthread, resultat); Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour); Console.Read(); Début de la méthode, veuillez patienter Le thread principal n'est pas bloqué pendant l'appel de la méthode L'appel a été effectué par le thread 7 et a retourné : Cet affichage a eu lieu après une attente de millième de secondes Nous avons donc créé un délégué retournant un string et possédant deux paramètres, un entier, et un entier passé par référence. Dans la classe AsyncAffichage nous avons une méthode ayant la même signature que le délégué. Cette méthode est simple, elle affiche une chaine, fait patienter le thread un certain temps, puis attribut une valeur à idthread et retourne une chaine. Dans notre Main, nous instancions notre classe AsyncAffichage, et notre délégué AsyncAppelMethode. Ensuite nous récupérons le retour de la méthode BeginInvoke de notre délégué dans une variable résultat de type IAsyncResult. BeginInvoke prend en paramètre les deux paramètres de la méthode d AsyncAffichage suivit de deux paramètres mit à null car facultatif ici. Nous effectuons ensuite une boucle conséquente pour montrer que le thread principal continue de tourner. Enfin nous récupérons le retour dans la méthode EndInvoke qui est en fait le retour de la méthode d AsyncAffichage. EndInvoke prend en paramètre toutes les valeurs passées par référence au délégué, donc ici idthread, puis le retour de BeginInvoke. Enfin nous affichons le retour de la méthode d AsyncAffichage.

41 41 Les Threads Le problème de ce code est que si nous déplaçons EndInvoke au dessus de notre imposante boucle for, celle ci sera bloquée jusqu à que l appel soit terminé, ce qui devient bien moins intéressant. Nous allons donc devoir utiliser un autre concept de l APM : Le modèle «Rendez Vous». 4.1 Modèles de programmation "Rendezvous" Les modèles de programmation "rendez vous" sont contenus dans 3 modèles de programmation asynchrone. Parmi les trois techniques, sachez que nous utilisons le plus souvent la dernière : Le modèle «Wait Until Done» Le modèle «Polling» Le modèle «Callback» Le modèle Wait Until Done Le modèle Wait Until Done est celui que nous avons utilisé dans notre exemple précédent. Cela consiste simplement à appeler la méthode EndInvoke qui va bloquer les threads et d attendre que l appel se termine avant de continuer. Ce modèle est peu utile, il revient à utiliser les threads de la même manière que dans la partie 1. N utilisez pas cette méthode si vos méthodes effectuent de lourds traitements sous peine de voir votre application se figer Le modèle Polling Le modèle Polling ressemble au modèle Wait Until Done, à la différence qu il va effectuer une boucle vérifiant sans arrêt si l appel est terminé avant d appeler EndInvoke. Voici un exemple d utilisation (nous ne présentons ici que la partie qui change pour plus de clarté) : 'VB Sub Main() Dim idthread As Integer Dim a As Integer = 0 Dim affichage As AsyncAffichage = New AsyncAffichage() Dim appel As AsyncAppelMethode = New AsyncAppelMethode(AddressOf affichage.mamethode) Dim resultat As IAsyncResult = appel.begininvoke(10000, idthread, Nothing, Nothing) For i As Integer = 1 To Step 1 a += 1 Next Console.WriteLine("0", a) Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode") While (Not resultat.iscompleted) Console.WriteLine("Divers traitements") Thread.Sleep(5000) End While Dim valeurderetour As String = appel.endinvoke(idthread, resultat) Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour) Console.Read()

42 42 Les Threads //C# static void Main(string[] args) int idthread; int a = 0; AsyncAffichage affichage = new AsyncAffichage(); AsyncAppelMethode appel = new AsyncAppelMethode(affichage.maMethode); IAsyncResult resultat = appel.begininvoke(10000, out idthread, null, null); for (int i = 0; i < ; i++) a++; Console.WriteLine("0", a); Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode"); while (!resultat.iscompleted) Console.WriteLine("Divers traitements"); Thread.Sleep(5000); string valeurderetour = appel.endinvoke(out idthread, resultat); Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour); Console.Read(); Début de la méthode, veuillez patienter Le thread principal n'est pas bloqué pendant l'appel de la méthode Divers traitements Divers traitements L'appel a été effectué par le thread 6 et a retourné : Cet affichage a eu lieu après une attente de millième de secondes Nous avons effectué une boucle vérifiant sans arrêt si la propriété resultat.iscompleted est à true. Tant qu elle ne l est pas, nous effectuons nos traitements. Comme vous pouvez le voir, cette méthode, même si elle est meilleure que Wait Until Done est tout de même très contraignante.

43 43 Les Threads Le modèle Callback Le modèle Callback nécessite que nous spécifiions une méthode à appeler dès que l appel est terminé. Pour appeler cette méthode nous définissons un délégué en tant que troisième paramètre de la méthode BeginInvoke, et notre objet affichage en tant que quatrième paramètre. La méthode appelée se chargera elle d exécuter EndInvoke et d effectuer les traitements adéquats. En utilisant la modèle Callback, vous pouvez travailler dans un environnement Asynchrone facilement et sans contraintes. Voici un exemple d utilisation (nous ne présentons ici que la partie qui change pour plus de clarté) : 'VB Dim idthread As Integer Dim a As Integer = 0 Public Sub CallbackAppel(ByRef idthread As Integer, ByVal tempsattente As Integer, ByRef appel As AsyncAppelMethode) appel.begininvoke(tempsattente, idthread, New AsyncCallback(AddressOf CallbackFin), appel) Public Sub CallbackFin(ByVal resultat As IAsyncResult) Dim appel As AsyncAppelMethode = CType(resultat.AsyncState, AsyncAppelMethode) Dim valeurderetour As String = appel.endinvoke(idthread, resultat) Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour) Sub Main() Dim affichage As AsyncAffichage = New AsyncAffichage() Dim appel As AsyncAppelMethode = New AsyncAppelMethode(AddressOf affichage.mamethode) CallbackAppel(idThread, 10000, appel) For i As Integer = 0 To Step 1 a += 1 Next Console.WriteLine("0", a) Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode") Console.Read()

44 44 Les Threads //C# private static int idthread; private static int a; static void CallbackAppel(out int idthread, int tempsattente, AsyncAppelMethode appel) appel.begininvoke(tempsattente, out idthread, new AsyncCallback(CallbackFin), appel); static void CallbackFin(IAsyncResult resultat) AsyncAppelMethode appel = (AsyncAppelMethode) resultat.asyncstate; string valeurderetour = appel.endinvoke(out idthread, resultat); Console.WriteLine("L'appel a été effectué par le thread 0 et a retourné : 1", idthread, valeurderetour); static void Main(string[] args) AsyncAffichage affichage = new AsyncAffichage(); AsyncAppelMethode appel = new AsyncAppelMethode(affichage.maMethode); CallbackAppel(out idthread, 10000, appel); for (int i = 0; i < ; i++) a++; Console.WriteLine("0", a); Console.WriteLine("Le thread principal n'est pas bloqué pendant l'appel de la méthode"); Console.Read(); Nous créons deux méthodes, une pour l appel de la méthode et une autre qui sera appelé à la fin de l appel. Notre méthode d appel est simplement constituée de l appel à la méthode BeginInvoke. Les paramètres de BeginInvoke sont ceux de la méthode d AsyncAffichage, puis du délégué pointant sur la méthode de fin d appel, et l objet appel qui sera envoyé avec le callback. La méthode CallbackFin récupère le résultat retourné par la méthode BeginInvoke une fois l appel terminé ainsi que l objet appel que l on récupère dans la propriété AsyncState. La suite est identique aux codes précédents. 4.2 L'APM et les exceptions Quand on utilise l APM, des exceptions particulières vont être levé en cas de problème lors du processus d appel. Même si elles sont levées pendant le processus d appel, ces exceptions ne peuvent être récupérées que lorsque EndInvoke est appelée. Pour les récupérer utilisez un bloc try/catch autour de l appel à EndInvoke.

45 45 Les Threads 4.3 Premier outil des APM : La classe ThreadPool Jusqu à présent nous avons crée nos propres threads asynchrone «à la main». Si cette manière de faire paraît intéressante lorsque nous n'utilisons qu un seul thread asynchrone, cela devient fastidieux en cas de multithreading. Le Framework.NET met à notre disposition un pool de threads afin de gérer le multithreading de manière simple et optimisée. Un pool de thread contient un nombre de thread minimum et maximum que vous pouvez utiliser en continu. En effet les threads libérés sont immédiatement réutilisable et ce dans la limite de disponibilité des threads. Si aucun thread n est disponible, les opérations suivante nécessitant un thread sont mise en file jusqu à ce qu un thread du pool soit disponible. Cette façon de faire permet non seulement de gérer le multithreading facilement, mais également plus rapidement Utilisation standard du pooling de threads Pour travailler avec le pool de threads vous devez utiliser les membres statiques de la classe ThreadPool : Méthodes Statiques Description GetAvailableThreads Retourne le nombre de thread disponibles dans le pool GetMaxThreads Retourne le nombre maximum de thread que supporte ce pool GetMinThreads Retourne le nombre minimum de thread que supporte ce pool. QueueUserWorkItem Met en queue une opération, si un thread est disponible, elle est immédiatement exécuté, sinon elle attend. RegisterWaitForSingleObject Permet d inscrire un délégué pour attendre un WaitHandle. (Voir Partie 2). Prend également un délai en paramètre pour faire expirer automatiquement le thread. SetMaxThreads Permet de définir le nombre maximum de threads du pool. Sachez que le nombre de threads dans le pool doit toujours être plus grand que le nombre de processeur de votre machine ou de cœurs dans votre processeur. SetMinThreads Permet de définir le nombre minimum de threads du pool. Sachez que le nombre de threads dans le pool doit toujours être plus grand que le nombre de processeur de votre machine ou de cœurs dans votre processeur. UnsafeQueueNativeOverlapped Permet de mettre en queue une opération d entrée/sortie avec chevauchement. Voir le chapitre 13 sur l Interopération. Cette méthode peut ouvrir des failles de sécurité! UnsafeQueueUserWorkItem Met en queue un objet sans les informations de contexte et la pile appelante, cette méthode peut ouvrir des failles de sécurité! UnsafeRegisterWaitForSingleObject Permet de définir un délégué qui attend un évènement WaitHandle. Ne propage pas les informations de contexte et la pile appelante. Cette méthode peut ouvrir des failles de sécurité!

46 46 Les Threads Redéfinir les bornes du pool de Thread permet d adapter le pool à votre application. Elever le nombre de Thread maximum pouvant travailler en parallèle va vous permettre d effectuer beaucoup plus de traitements simultanément, et donc d accélérer les opérations. Cela est vrai seulement si les tâches ne sont pas trop lourdes, auquel cas, faire tourner trop de threads lourd en simultané aura un impact sur les performances. Elever le nombre de Thread Minimum va vous permettre d obtenir dès lancement de l application des threads déjà prêts à travailler. Ainsi, vous pourrez effectuer plus rapidement vos opérations. Cela est particulièrement utile si vous avez de nombreuses opérations à effectuer au lancement de votre application. En effet, créer de nouveaux threads dans le pool, après son démarrage, prendra beaucoup de ressources et pourra nuire aux performances. Nous allons illustrer l utilisation du pool de threads avec un exemple. Nous allons faire faire une boucle simple à plusieurs threads du pool, et nous limitons à deux Threads maximum le pool. 'VB Public Sub affichagethreads(byval o As Object) Dim chaine As String = CType(o, String) Dim i As Integer = 0 While i < 2 Console.WriteLine("0 1", chaine, Thread.CurrentThread.ManagedThreadId) i += 1 Thread.Sleep(100) End While Sub Main() Dim threads As Integer Dim completionport As Integer ThreadPool.SetMaxThreads(2, 100) ThreadPool.SetMinThreads(2, 100) ThreadPool.GetAvailableThreads(threads, completionport) Console.WriteLine("Nombre de Threads disponibles : 0", threads.tostring()) Dim objet As WaitCallback = New WaitCallback(AddressOf affichagethreads) For i As Integer = 0 To 10 Step 1 If (Not ThreadPool.QueueUserWorkItem(objet, "Execution d'une opération du thread")) Then Console.WriteLine("Impossible de rajoute cet objet au Pool") End If Next Console.Read()

47 47 Les Threads //C# static void affichagethreads(object o) string chaine = o as string; for (int x = 0; x < 2; ++x) Console.WriteLine("0 1",chaine,Thread.CurrentThread.ManagedThreadId); Thread.Sleep(100); static void Main(string[] args) int threads; int completionport; ThreadPool.SetMaxThreads(2, 100); ThreadPool.SetMinThreads(2, 100); ThreadPool.GetAvailableThreads(out threads, out completionport); Console.WriteLine("Nombre de Threads disponibles : 0", threads.tostring()); WaitCallback objet = new WaitCallback(affichageThreads); for (int i = 0; i < 10; i++) if (!ThreadPool.QueueUserWorkItem(objet, "Execution d'une opération du thread")) Console.WriteLine("Impossible de rajoute cet objet au Pool"); Console.Read(); Nombre de Threads disponibles : 2 Execution d'une opération du thread 6 Execution d'une opération du thread 6 Execution d'une opération du thread 6 Execution d'une opération du thread 6 [ ] Execution d'une opération du thread 10 Execution d'une opération du thread 6 Execution d'une opération du thread 10 Execution d'une opération du thread 6 Execution d'une opération du thread 6 Nous avons donc une méthode effectuant une boucle simple affichant le numéro d identification du thread. La méthode appelée doit forcement avoir un objet en paramètre même s il n est pas utilisé. Dans notre Main nous commençons par définir les minimums et maximums de notre ThreadPool et comme vous pouvez le voir, la méthode prend deux arguments. Le second argument correspondant aux limites des complétions ports qui sont des threads réservés aux entrées/sorties asynchrone. Ensuite nous affichons le nombre de threads disponibles avant de commencer. Dans notre cas, le résultat est deux, qui est le minimum sur la machine d exemple. Remarquez que pour récupérer le nombre de threads, nous avons passé une variable par référence à notre méthode.

48 48 Les Threads Ensuite nous créons notre délégué qui assignera une méthode à chaque thread jusqu à la fin de la boucle for. Nous utilisons la méthode QueueUserWorkItem pour assigner nos opérations à un thread et nous vérifions que tous les objets ont pu être mit en file au cas où arriverait un problème ThreadPool et WaitHandle Nous l avons vu dans la partie 2 que les objets Mutex, Semaphore et Event héritent de la class WaitHandle. Le pool de Thread supporte également le verrouillage fourni par WaitHandle. Nous pouvons ainsi faire en sorte que certains threads attendent un signal avant de d appeler des méthodes. Afin d utiliser WaitHandle, nous allons nous servir de la méthode RegisterWaitForSingleObject qui va prendre en paramètre notre objet de verrouillage (par exemple un mutex), un délégué de type WaitOrTimerCallback qui se déclenche au signal ou à l expiration du compteur, un objet qui va accompagner le callback, le temps avant expiration et enfin un booléen indiquant si on veut réinitialiser ou non le compteur une fois le temps expiré. 'VB Public Sub mutexdeclenche(byval etat As Object, ByVal tempsecoule As Boolean) If (tempsecoule) Then Console.WriteLine("Le Mutex est expiré") Else Console.WriteLine("Le Mutex a reçu le signal") End If Sub Main() Dim mutex As Mutex = New Mutex(True) ThreadPool.RegisterWaitForSingleObject(mutex, New WaitOrTimerCallback(AddressOf mutexdeclenche), Nothing, 1000, True) mutex.releasemutex() Console.Read() //C# static void mutexdeclenche (object etat, bool tempsecoule) if (tempsecoule) Console.WriteLine("Le Mutex est expiré"); else Console.WriteLine("Le Mutex a reçu le signal"); static void Main(string[] args) Mutex mutex = new Mutex(true); ThreadPool.RegisterWaitForSingleObject(mutex, new WaitOrTimerCallback(mutexDeclenche), null,1000, true); mutex.releasemutex(); Console.Read(); Le Mutex a reçu le signal Nous avons donc instancié notre Mutex que nous enregistrons dans le pool de threads avec une durée limite de 1 seconde. Si le verrouillage fourni par le Mutex n'est pas débloqué avant cette seconde d'attente, la méthode callback passée en paramètre verra sa propriété "tempsecoule" être définie a false.

49 49 Les Threads Ensuite nous utilisons la méthode ReleaseMutex pour lever le verrouillage et ainsi déclencher l événement. La méthode est donc lancée et nous indique que le signal a été reçu dans les temps. Notre méthode mutexdeclenche prend obligatoirement deux paramètres minimum, l état du thread et un booléen indiquant si le temps avant expiration est écoulé.

50 50 Les Threads 4.4 Un autre outil des APM : La classe SynchronizationContext Cette classe permet d'uniformiser un processus d'exécution peu importe le modèle d'exécution choisi. Par exemple (en excluant les éventuels threads créés par le développeur), là où les applications Winforms vont exécuter toutes les opérations dans un seul thread, les applications ASP.NET les exécutent dans un pool de thread. Voici quelques membres de cette classe : Membres Description Send Cette méthode va exécuter le contenu d'une méthode passée en paramètre de façon synchrone. Cette opération va bloquer tous les autres threads susceptibles d'exécuter ce code jusqu'à ce que le travail soit terminé. Post Cette méthode va exécuter le contenu d'une méthode de façon asynchrone. Cette opération mettra la nouvelle tâche dans une file d'attente si la tâche précédente n'a pas été terminée. Current Propriété statique contenant le contexte de synchronisation actuel. Dans tous les cas, ce système est utile s'il ne s'agit que d'effectuer des opérations qui ne retournent rien : Les méthodes Post et Send ne retournent aucun objet. 'VB Public Sub methode(byval o As Object) Console.WriteLine(CType(o, String)) For i As Integer = Integer.MinValue To Integer.MaxValue - 1 Step 1 Next Sub Main() Dim context As SynchronizationContext = New SynchronizationContext() context.post(addressof methode, "One Work Is Started") context.send(addressof methode, "Please Wait") Console.WriteLine("Fin d'exec") Console.Read() //C# static void methode(object o) Console.WriteLine("0", (string)o); for(int i = Int32.MinValue; i < Int32.MaxValue - 1; i++) ; static void Main(string[] args) SynchronizationContext context = new SynchronizationContext(); context.post(methode, "One Work Is Started"); context.send(methode, "Please Wait"); Console.WriteLine("Fin d'exec"); Console.Read(); Dans cet exemple, la méthode à exécuter affiche l'objet passé en paramètre et fait une boucle qui part de la plus petite valeur d'un entier jusqu'à la plus grande possible. Dans un premier temps, nous lançons le travail à effectuer de façon asynchrone. Puis nous lançons la même tâche de façon synchrone. Voici le résultat :

51 51 Les Threads One Work Is Started Please Wait Et après quelques temps: One Work Is Started Please Wait Fin d'exec 4.5 La classe Timer L objet Timer va nous permettre de déclencher des méthodes en fonction du temps. Imaginez une application qui lance un effet sonore toute les heures. Nous pourrions la baser sur un timer qui lancera une méthode permettant de jouer le son à chaque heure écoulée. L exemple étant intéressant mais un peu trop complexe, nous allons le simplifier pour le présenter. Nous créons donc un Timer qui déclenche toutes les secondes une méthode. 'VB Dim pair As Integer = 0 Public Sub horloge(byval state As Object) If ((pair Mod 2) = 0) Then Console.WriteLine("Tic") Else Console.WriteLine("Tac") End If pair += 1 Sub Main() Dim tm As Timer = New Timer(New TimerCallback(AddressOf horloge), Nothing, 0, 1000) Console.Read() //C# private static int pair; static void horloge(object state) if ((pair % 2) == 0) Console.WriteLine("Tic"); else Console.WriteLine("Tac"); pair++; static void Main(string[] args) pair = 0; Timer tm = new Timer(new TimerCallback(horloge), null, 0, 1000); Tic Tac Tic Tac Tic Tac Console.Read();

52 52 Les Threads Le timer prend ici quatre paramètres : Un délégué chargé d appeler la méthode horloge à chaque fois que le timer se déclenche (ici toutes les secondes) Un objet qui accompagne le callback (ici à null) Le temps en millisecondes avant que le callback soit déclenché, 0 indique immédiatement, et une constante infini désactive le déclenchement du callback Le temps en millisecondes avant que le timer se réinitialise, 0 réinitialise le timer immédiatement, une constante infini l empêche de se réinitialiser. Dans l exemple nous définissons donc un timer qui déclenchera la méthode horloge à chaque seconde. Sachez que vous pouvez utiliser la méthode Change du timer afin de modifier les paramètres de déclenchement. 'VB Sub Main() Dim tm As Timer = New Timer(New TimerCallback(AddressOf horloge), Nothing, 0, 1000) tm.change(0, Timeout.Infinite) //C# static void Main(string[] args) Timer tm = new Timer(new TimerCallback(horloge), null, 0, 1000); tm.change(0, Timeout.Infinite); Ici, on se contente de changer le timer afin qu il déclenche immédiatement l appel de la méthode horloge mais ne se réinitialise jamais.

53 53 Les Threads 5 Conclusion Vous avez pu remarquer tout au long de ce chapitre que les threads permettent de faire beaucoup de choses. Cependant, malgré leur simplicité apparente, ils peuvent également être source d'erreurs importantes. C'est pourquoi, afin de limiter les erreurs, des mécanismes de verrouillage ont été mis en place afin de permettre au développeur bien manager les processus qu'il utilise. A la fin de ce chapitre, vous devriez être capable de : Créer plusieurs threads pour effectuer des tâches différentes en parallèle. Savoir comment verrouiller des blocs de code sans pour autant entrer dans des situations d'exécution bloquées (deadlock) Savoir créer et utiliser les verrouillages en lecture/écriture et utiliser les outils de verrouillage évènementiels dérivant de WaitHandle. Avoir compris le principe d'apm (Asynchronous Programing Models) et savoir s'en servir quand ils sont disponible. Savoir utiliser l'outil de Multithreading ThreadPool et savoir comment le verrouiller avec des outils de verrouillage évènementiel. Savoir utiliser le compteur Timer pour exécuter des portions de code a intervalles réguliers Dans tous les cas, n'hésitez pas à aller visiter le MSDN qui peut vous apporter beaucoup d'aide dans vos développements :

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java Info0604 Programmation multi-threadée Cours 5 Programmation multi-threadée en Java Pierre Delisle Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique 18 février 2015 Plan

Plus en détail

Processus, threads et gestion de la synchronisation

Processus, threads et gestion de la synchronisation CS_doNet/05 Page 117 Mercredi, 14. mai 2003 10:32 10 5 Processus, threads et gestion de la synchronisation Nous exposons ici les notions fondamentales que sont les processus et les threads, dans l architecture

Plus en détail

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation Cycle Ingénierie 2e année SIGL Dernière mise à jour : 19/10/2006 Christophe Porteneuve Threads Principes Cycle de vie Création java.lang.thread

Plus en détail

Synchro et Threads Java TM

Synchro et Threads Java TM Synchro et Threads Java TM NICOD JEAN-MARC Master 2 Informatique Université de Franche-Comté UFR des Sciences et Techniques septembre 2008 NICOD JEAN-MARC Synchro et Threads avec Java TM 1 / 32 Sommaire

Plus en détail

Introduction : les processus. Introduction : les threads. Plan

Introduction : les processus. Introduction : les threads. Plan IN328 Programmation distribuée avec Java et J2EE 2 - Threads en Java Introduction : les processus Un processus est un ensemble d instructions à exécuter, un espace mémoire réservé et éventuellement d autres

Plus en détail

Problèmes liés à la concurrence

Problèmes liés à la concurrence ENS Cachan Problématique Difficile de gérer la concurrence : Pas toujours facile d avoir des fonctions réentrantes. Risque de race condition : ex : x :=x+1 x :=x+1 On voudrait des blocs d instructions

Plus en détail

Notion de thread (1/2)

Notion de thread (1/2) Notion de thread (1/2) La machine virtuelle java (JVM) permet d'exécuter plusieurs traitements en parallèle (en pratique, ils s'exécutent par tranche et en alternance sur le processeur). Ces traitements

Plus en détail

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la

Plus en détail

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface

Plus en détail

Services Windows et Domaines d application

Services Windows et Domaines d application 1 Sommaire... 1 1 Introduction... 2 2 Les services Windows... 3 2.1 Création et mise en place d un service pas à pas... 4 2.1.1 Créer un service... 4 2.1.2 Gérer son service Windows... 12 2.2 Exemple pratique...

Plus en détail

Threads. Threads. USTL http://www.lifl.fr/ routier 1

Threads. Threads. USTL http://www.lifl.fr/ routier 1 Threads USTL http://www.lifl.fr/ routier 1 Rappels - Définitions un Process est un programme qui tourne et dispose de ses propres ressources mémoire. OS multi-tâche plusieurs process en concurrence un

Plus en détail

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting IUT Bordeaux 1 2005-2006 Département Informatique Licence Professionnelle ~ SI TD Objets distribués n 3 : Windows XP et Visual Studio.NET Introduction à.net Remoting Partie 1 : l'analyseur de performances

Plus en détail

INITIATION AU LANGAGE JAVA

INITIATION AU LANGAGE JAVA INITIATION AU LANGAGE JAVA I. Présentation 1.1 Historique : Au début des années 90, Sun travaillait sur un projet visant à concevoir des logiciels simples et performants exécutés dans des PDA (Personnal

Plus en détail

Paginer les données côté serveur, mettre en cache côté client

Paginer les données côté serveur, mettre en cache côté client Paginer les données côté serveur, mettre en cache côté client Vous voulez sélectionner des lignes dans une table, mais celle-ci comporte trop de lignes pour qu il soit réaliste de les ramener en une seule

Plus en détail

Projet gestion d'objets dupliqués

Projet gestion d'objets dupliqués Projet gestion d'objets dupliqués Daniel Hagimont [email protected] 1 Projet Service de gestion d'objets dupliqués Mise en cohérence lors de la prise d'un verrou sur un objet Pas de verrous imbriqués

Plus en détail

Un ordonnanceur stupide

Un ordonnanceur stupide Un ordonnanceur simple Université Paris Sud L objet des exercices qui suivent est de créer un ordonanceur implantant l algorithme du tourniquet ( round-robin scheduler ). La technique utilisée pour élire

Plus en détail

PROGRAMMATION EVENEMENTIELLE sur EXCEL

PROGRAMMATION EVENEMENTIELLE sur EXCEL MASTERs SMaRT & GSI PROGRAMMATION EVENEMENTIELLE sur EXCEL Pierre BONNET Programmation évènementielle La programmation évènementielle permet un appel de procédure depuis l'interface HMI d'excel (ou d'un

Plus en détail

Le MSMQ. Version 1.0. Pierre-Franck Chauvet

Le MSMQ. Version 1.0. Pierre-Franck Chauvet Le MSMQ Version 1.0 Z Pierre-Franck Chauvet 2 [Le MSMQ] [Date : 10/10/09] Sommaire 1 Introduction... 3 2 Le Concept... 5 2.1 Les messages... 5 2.2 Les files d attentes... 5 2.3 WorkGroup... 7 2.4 Active

Plus en détail

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing 3/4/27 Programmation Avancée Multimédia Multithreading Benoît Piranda Équipe SISAR Université de Marne La Vallée Besoin Programmes à traitements simultanés Réseau Réseau Afficher une animation en temps

Plus en détail

Exclusion Mutuelle. Arnaud Labourel Courriel : [email protected]. Université de Provence. 9 février 2011

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011 Arnaud Labourel Courriel : [email protected] Université de Provence 9 février 2011 Arnaud Labourel (Université de Provence) Exclusion Mutuelle 9 février 2011 1 / 53 Contexte Epistémologique

Plus en détail

Remote Method Invocation Les classes implémentant Serializable

Remote Method Invocation Les classes implémentant Serializable Parallélisme Architecture Eric Goubault Commissariat à l Energie Atomique Saclay Classe qui implémente la méthode distante (serveur): - dont les méthodes renvoient un objet serializable - ou plus généralement

Plus en détail

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INTRODUCTION A JAVA. Fichier en langage machine Exécutable INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du

Plus en détail

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris : Développement d un client REST, l application Vélib 1. Présentation L application présentée permet de visualiser les disponibilités des vélos et des emplacements de parking à la disposition des parisiens

Plus en détail

Introduction à la programmation concurrente

Introduction à la programmation concurrente Introduction à la programmation concurrente Moniteurs Yann Thoma Reconfigurable and Embedded Digital Systems Institute Haute Ecole d Ingénierie et de Gestion du Canton de Vaud This work is licensed under

Plus en détail

Gestion du cache dans les applications ASP.NET

Gestion du cache dans les applications ASP.NET Gestion du cache dans les applications ASP.NET Version 1.0 James RAVAILLE http://blogs.dotnet france.com/jamesr 2 Gestion du cache dans les applications ASP.NET v 1.0 03/01/09 Sommaire 1 Introduction...

Plus en détail

Premiers Pas en Programmation Objet : les Classes et les Objets

Premiers Pas en Programmation Objet : les Classes et les Objets Chapitre 2 Premiers Pas en Programmation Objet : les Classes et les Objets Dans la première partie de ce cours, nous avons appris à manipuler des objets de type simple : entiers, doubles, caractères, booléens.

Plus en détail

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores INTRODUCTION AUX SYSTEMES D EXPLOITATION TD2 Exclusion mutuelle / Sémaphores Exclusion mutuelle / Sémaphores - 0.1 - S O M M A I R E 1. GENERALITES SUR LES SEMAPHORES... 1 1.1. PRESENTATION... 1 1.2. UN

Plus en détail

Création d objet imbriqué sous PowerShell.

Création d objet imbriqué sous PowerShell. Création d objet imbriqué sous PowerShell. Par Laurent Dardenne, le 13/01/2014. Niveau Ce tutoriel aborde la création d objet composé, c est-à-dire que certains de ses membres seront eux-mêmes des PSObjects.

Plus en détail

Programmer en JAVA. par Tama ([email protected]( [email protected])

Programmer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Programmer en JAVA par Tama ([email protected]( [email protected]) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes

Plus en détail

Cours de Systèmes d Exploitation

Cours de Systèmes d Exploitation Licence d informatique Synchronisation et Communication inter-processus Hafid Bourzoufi Université de Valenciennes - ISTV Introduction Les processus concurrents s exécutant dans le système d exploitation

Plus en détail

Les processus légers : threads. Système L3, 2014-2015 1/31

Les processus légers : threads. Système L3, 2014-2015 1/31 Les processus légers : threads Système L3, 2014-2015 1/31 Les threads Les threads sont des processus légers exécutés à l intérieur d un processus L exécution des threads est concurrente Il existe toujours

Plus en détail

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. [email protected] www.cril.univ-artois.fr/~jabbour

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr www.cril.univ-artois.fr/~jabbour LMI 2 Programmation Orientée Objet POO - Cours 9 Said Jabbour [email protected] www.cril.univ-artois.fr/~jabbour CRIL UMR CNRS 8188 Faculté des Sciences - Univ. Artois Février 2011 Les collections

Plus en détail

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. RMI Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. Méthode proche de RPC. Outils et classes qui rendent l'implantation d'appels de méthodes d'objets distants aussi simples

Plus en détail

RMI le langage Java XII-1 JMF

RMI le langage Java XII-1 JMF Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine

Plus en détail

Gestion distribuée (par sockets) de banque en Java

Gestion distribuée (par sockets) de banque en Java Gestion distribuée (par sockets) de banque en Java Université Paris Sud Rappel sur la solution locale de gestion simple de banque L objet de cet exercice était de créer une application java qui implante

Plus en détail

Projet Active Object

Projet Active Object Projet Active Object TAO Livrable de conception et validation Romain GAIDIER Enseignant : M. Noël PLOUZEAU, ISTIC / IRISA Pierre-François LEFRANC Master 2 Informatique parcours MIAGE Méthodes Informatiques

Plus en détail

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs Utilisation des classes de PourCGI par Michel Michaud, version 2002-11-23 Les fichiers PourCGI.h et PourCGI.cpp rendent disponibles deux classes et une fonction libre qui permettent de faire facilement

Plus en détail

Une introduction à la technologie EJB (2/3)

Une introduction à la technologie EJB (2/3) Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce

Plus en détail

Généralités sur le Langage Java et éléments syntaxiques.

Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...

Plus en détail

Manipulation 4 : Application de «Change».

Manipulation 4 : Application de «Change». Manipulation 4 : Application de «Change». Première partie : Cette manipulation a pour but d utiliser un service Web afin d obtenir les taux de change appliqués entre les différentes monnaies référencées

Plus en détail

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle - 2012-2013 P. Bonnet Programmation VBA Pierre BONNET 21 La programmation VBA Historiquement, la programmation sous Excel avait comme fonction d'automatiser une succession d'actions faites dans la feuille à l'aide de la souris.

Plus en détail

Auto-évaluation Programmation en Java

Auto-évaluation Programmation en Java Auto-évaluation Programmation en Java Document: f0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INTRODUCTION AUTO-ÉVALUATION PROGRAMMATION EN

Plus en détail

TP1 : Initiation à Java et Eclipse

TP1 : Initiation à Java et Eclipse TP1 : Initiation à Java et Eclipse 1 TP1 : Initiation à Java et Eclipse Systèmes d Exploitation Avancés I. Objectifs du TP Ce TP est une introduction au langage Java. Il vous permettra de comprendre les

Plus en détail

Exercices INF5171 : série #3 (Automne 2012)

Exercices INF5171 : série #3 (Automne 2012) Exercices INF5171 : série #3 (Automne 2012) 1. Un moniteur pour gérer des ressources Le moniteur MPD 1 présente une première version d'un moniteur, exprimé en pseudo-mpd, pour gérer des ressources le nombre

Plus en détail

Cours Programmation Système

Cours Programmation Système Cours Programmation Système Filière SMI Semestre S6 El Mostafa DAOUDI Département de Mathématiques et d Informatique, Faculté des Sciences Université Mohammed Premier Oujda [email protected] Février

Plus en détail

Héritage presque multiple en Java (1/2)

Héritage presque multiple en Java (1/2) Héritage presque multiple en Java (1/2) Utiliser deux classes ou plus dans la définition d'une nouvelle classe peut se faire par composition. class Etudiant{ int numero; Diplome d; float passeexamen(examen

Plus en détail

TAGREROUT Seyf Allah TMRIM

TAGREROUT Seyf Allah TMRIM TAGREROUT Seyf Allah TMRIM Projet Isa server 2006 Installation et configuration d Isa d server 2006 : Installation d Isa Isa server 2006 Activation des Pings Ping NAT Redirection DNS Proxy (cache, visualisation

Plus en détail

Utilisation d objets : String et ArrayList

Utilisation d objets : String et ArrayList Chapitre 6 Utilisation d objets : String et ArrayList Dans ce chapitre, nous allons aborder l utilisation d objets de deux classes prédéfinies de Java d usage très courant. La première, nous l utilisons

Plus en détail

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ; CNAM NFP121 TP 10 19/11/2013 (Séance 5) Objectif Manipuler les exceptions ; 1 Entrées/sorties Exercice 1 : Lire un entier à partir du clavier Ajouter une méthode readint(string message) dans la classe

Plus en détail

Tp 1 correction. Structures de données (IF2)

Tp 1 correction. Structures de données (IF2) Tp 1 correction Structures de données (IF2) Remarque générale : compilez et exécutez le code au-fur-et-à mesure de son écriture. Il est plus facile de corriger une petite portion de code délimitée que

Plus en détail

Calcul Parallèle. Cours 5 - JAVA RMI

Calcul Parallèle. Cours 5 - JAVA RMI Calcul Parallèle Cours 5 - JAVA RMI Eric Goubault Commissariat à l Energie Atomique & Chaire Ecole Polytechnique/Thalès Saclay Le 28 février 2012 Eric Goubault 1 28 février 2012 Remote Method Invocation

Plus en détail

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions

Les transactions 1/46. I même en cas de panne logicielle ou matérielle. I Concept de transaction. I Gestion de la concurrence : les solutions 1/46 2/46 Pourquoi? Anne-Cécile Caron Master MAGE - SGBD 1er trimestre 2014-2015 Le concept de transaction va permettre de définir des processus garantissant que l état de la base est toujours cohérent

Plus en détail

Programmation Orientée Objet en C#

Programmation Orientée Objet en C# Programmation Orientée Objet en C# 1 Introduction 1.1 Présentation Tout bon développeur le sait, le code d'un programme doit être propre, commenté, facile à maintenir et à améliorer. Vous êtes adepte de

Plus en détail

Cours Bases de données 2ème année IUT

Cours Bases de données 2ème année IUT Cours Bases de données 2ème année IUT Cours 12 : Concurrence d accès Anne Vilnat http://www.limsi.fr/individu/anne/cours Plan 1 Accès concurrents Définitions Verrous Collisions Niveaux de cohérence Blocage

Plus en détail

Créer et partager des fichiers

Créer et partager des fichiers Créer et partager des fichiers Le rôle Services de fichiers... 246 Les autorisations de fichiers NTFS... 255 Recherche de comptes d utilisateurs et d ordinateurs dans Active Directory... 262 Délégation

Plus en détail

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla Table des matières Table des matières Généralités Présentation Interface Utiliser FileZilla Connexion FTP Connexion SFTP Erreurs de connexion Transfert des fichiers Vue sur la file d'attente Menu contextuel

Plus en détail

Module.NET 3 Les Assemblys.NET

Module.NET 3 Les Assemblys.NET Module.NET Chapitre 3 Les Assemblys.NET 2011/2012 Page 1 sur 13 Contenu Cours... 3 3.1 - Définition d un assembly.net... 3 3.2 - Private assembly ou assembly privé.... 3 3.3 - Shared assembly ou assembly

Plus en détail

Java DataBaseConnectivity

Java DataBaseConnectivity Java DataBaseConnectivity JDBC JDBC est une API Java (ensemble de classes et d interfaces défini par SUN et les acteurs du domaine des SGBD) permettant d accéder aux bases de données à l aide du langage

Plus en détail

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5

SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N

Plus en détail

.NET - Classe de Log

.NET - Classe de Log .NET - Classe de Log Classe permettant de Logger des données Text Dans tous les projets, il est indispensable de pouvoir stocker de l'information textuelle : Pour le suivi des erreurs Pour le suivi de

Plus en détail

Guide plateforme FOAD ESJ Lille

Guide plateforme FOAD ESJ Lille Guide plateforme FOAD ESJ Lille v. 1.2 «étudiants» septembre 2014 Réalisé par Maxime Duthoit Ingénieur pédagogique multimédia à l ESJ Lille Sommaire Introduction... 1 1. Accueil et connexion... 2 2. Accueil

Plus en détail

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3. 1. Structure d un programme C Un programme est un ensemble de fonctions. La fonction "main" constitue le point d entrée pour l exécution. Un exemple simple : #include int main() { printf ( this

Plus en détail

Développement Logiciel

Développement Logiciel Développement Logiciel Éxamen session 1-2012-2013 (Vendedi 25 mai, 9h-11h) Seuls les documents liés directement au cours sont autorisés (comme dit sur le site) : sujets de TD, notes de cours, notes personnelles

Plus en détail

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. Encapsulation L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. La visibilité dépend des membres : certains membres peuvent être visibles et d'autres

Plus en détail

Manuel d utilisation de la plate-forme de gestion de parc UCOPIA. La mobilité à la hauteur des exigences professionnelles

Manuel d utilisation de la plate-forme de gestion de parc UCOPIA. La mobilité à la hauteur des exigences professionnelles Manuel d utilisation de la plate-forme de gestion de parc UCOPIA La mobilité à la hauteur des exigences professionnelles 2 Manuel d utilisation de la plate-forme de gestion de parc UCOPIA 1 Table des matières

Plus en détail

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig [email protected]

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig Fabienne.Boyer@imag.fr 4. Outils pour la synchronisation F. Boyer, Laboratoire Lig [email protected] Le problème Insuffisance des solutions de base (verrous) Les solutions de plus haut niveau Les Sémaphores Les Moniteurs

Plus en détail

Guide d'installation. Release Management pour Visual Studio 2013

Guide d'installation. Release Management pour Visual Studio 2013 1 Guide d'installation Release Management pour Visual Studio 2013 Le contenu de ce document est fourni «en l'état». Les informations et les points de vue contenus dans ce document, y compris les URL et

Plus en détail

Chapitre 10. Les interfaces Comparable et Comparator 1

Chapitre 10. Les interfaces Comparable et Comparator 1 Chapitre 10: Les interfaces Comparable et Comparator 1/5 Chapitre 10 Les interfaces Comparable et Comparator 1 1 Ce chapitre a été extrait du document "Objets, Algorithmes, Patterns" de [René Lalement],

Plus en détail

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007 NFP 121 Java et les Threads Présentation : Thierry Escalarasse Mai 2007 Plan du cour Présentation de la notion de Threads La classe Thread L interface Runnable Les états d un thread La Synchronisation

Plus en détail

Installation de Windows 2003 Serveur

Installation de Windows 2003 Serveur Installation de Windows 2003 Serveur Introduction Ce document n'explique pas les concepts, il se contente de décrire, avec copies d'écran, la méthode que j'utilise habituellement pour installer un Windows

Plus en détail

Tester ses applications

Tester ses applications 1 Tester ses applications Tester ses applications Sommaire Tester ses applications... 1 1 Introduction... 2 2 Debugger son application... 3 2.1 Les classes Debug et Trace... 5 2.2 Les traceurs... 7 2.3

Plus en détail

Java Licence Professionnelle 2009-2010. Cours 7 : Classes et méthodes abstraites

Java Licence Professionnelle 2009-2010. Cours 7 : Classes et méthodes abstraites Java Licence Professionnelle 2009-2010 Cours 7 : Classes et méthodes abstraites 1 Java Classes et méthodes abstraites - Le mécanisme des classes abstraites permet de définir des comportements (méthodes)

Plus en détail

WHS ProRealTime. édition 2008 1.52

WHS ProRealTime. édition 2008 1.52 WHS ProRealTime édition 2008 1.52 Ce tutoriel est dédié aux fonctions de passage d'ordres sur ProRealTime avec WHSelfinvest. Pour obtenir une aide sur les autres fonctions de ProRealTime, veuillez consulter

Plus en détail

TD3: tableaux avancées, première classe et chaînes

TD3: tableaux avancées, première classe et chaînes TD3: tableaux avancées, première classe et chaînes de caractères 1 Lestableaux 1.1 Élémentsthéoriques Déclaration des tableaux Pour la déclaration des tableaux, deux notations sont possibles. La première

Plus en détail

DirXML License Auditing Tool version 1.1 - Guide de l'utilisateur

DirXML License Auditing Tool version 1.1 - Guide de l'utilisateur DirXML License Auditing Tool version 1.1 - Guide de l'utilisateur Présentation Installation DirXML License Auditing Tool (DLAT) vous permet de déterminer le nombre de licences DirXML utilisées dans une

Plus en détail

1. Base de données SQLite

1. Base de données SQLite Dans ce TP, nous allons voir comment créer et utiliser une base de données SQL locale pour stocker les informations. La semaine prochaine, ça sera avec un WebService. On repart de l application AvosAvis

Plus en détail

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars 2014. http://homepages.laas.fr/matthieu/cours/java/java.pdf Introduction à Java Matthieu Herrb CNRS-LAAS http://homepages.laas.fr/matthieu/cours/java/java.pdf Mars 2014 Plan 1 Concepts 2 Éléments du langage 3 Classes et objets 4 Packages 2/28 Histoire et motivations

Plus en détail

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES TRAVAUX PRATIQUES Le présent travail vise à développer une interface visuelle de programmation des entrées- sorties du port LPT d un PC à l aide du logiciel VISUAL BASIC. I- EDITION ET TEST DU PROGRAMME

Plus en détail

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java Langages objets Introduction M2 Pro CCI, Informatique Emmanuel Waller, LRI, Orsay présentation du module logistique 12 blocs de 4h + 1 bloc 2h = 50h 1h15 cours, 45mn exercices table, 2h TD machine page

Plus en détail

Java Licence Professionnelle CISII, 2009-10

Java Licence Professionnelle CISII, 2009-10 Java Licence Professionnelle CISII, 2009-10 Cours 4 : Programmation structurée (c) http://www.loria.fr/~tabbone/cours.html 1 Principe - Les méthodes sont structurées en blocs par les structures de la programmation

Plus en détail

BTS S.I.O. 2012-2013 PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

BTS S.I.O. 2012-2013 PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais BTS S.I.O. 2012-2013 PHP OBJET Module SLAM4 Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais Table des matières 1 But... 3 2 Les bases :... 3 3 Utilisation d'une classe : Instanciation...3

Plus en détail

Java Licence Professionnelle CISII, 2009-2010

Java Licence Professionnelle CISII, 2009-2010 Licence Professionnelle CISII, 2009-2010 Cours 1 : Introduction à Java A. Belaïd [email protected] Cours disponible sur le site : http://www.loria.fr/~abelaid puis Teaching 1 Fonctionnement 12 séances :

Plus en détail

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données EARTH et Threaded-C: Éléments clés du manuel de références de Threaded-C Bref historique de EARTH et Threaded-C Ancêtres de l architecture EARTH: Slide 1 Machine à flux de données statique de J.B. Dennis

Plus en détail

Bases de données et sites WEB Licence d informatique LI345

Bases de données et sites WEB Licence d informatique LI345 Bases de données et sites WEB Licence d informatique LI345 Anne Doucet [email protected] http://www-bd.lip6.fr/ens/li345-2013/index.php/lescours 1 Contenu Transactions en pratique Modèle relationnel-objet

Plus en détail

Performances de la programmation multi-thread

Performances de la programmation multi-thread UFR Sciences et techniques de Franche-Comté Projet semestriel 2ème année de Master Informatique Performances de la programmation multi-thread Auteur(s) : Beuque Eric Moutenet Cyril Tuteur(s) : Philippe

Plus en détail

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 ) P r ob lé m a t iq u e d e la g é n é r icit é les versions de Java antérieures à 1.5 permettaient de créer des classes de structures contenant n'importe quels types d'objet : les collections (classes

Plus en détail

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN [email protected]

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN fbertin@neotilus.com Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184 Frédéric BERTIN [email protected] Présentaion : Mobile 3D Graphics API JSR 184 M3G :présentation Package optionnel de l api J2ME. Prend

Plus en détail

Le langage C. Séance n 4

Le langage C. Séance n 4 Université Paris-Sud 11 Institut de Formation des Ingénieurs Remise à niveau INFORMATIQUE Année 2007-2008 Travaux pratiques d informatique Le langage C Séance n 4 But : Vous devez maîtriser à la fin de

Plus en détail

Notions fondamentales du langage C# Version 1.0

Notions fondamentales du langage C# Version 1.0 Notions fondamentales du langage C# Version 1.0 Z 2 [Notions fondamentales du langage Csharp] [Date : 25/03/09] Sommaire 1 Tout ce qu il faut savoir pour bien commencer... 3 1.1 Qu est ce qu un langage

Plus en détail

Programme Compte bancaire (code)

Programme Compte bancaire (code) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; Programme Compte bancaire (code) namespace compte_bancaire /// Classe Program public

Plus en détail

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7

Plan du cours. Historique du langage http://www.oracle.com/technetwork/java/index.html. Nouveautés de Java 7 Université Lumière Lyon 2 Faculté de Sciences Economiques et Gestion KHARKIV National University of Economic Introduction au Langage Java Master Informatique 1 ère année Julien Velcin http://mediamining.univ-lyon2.fr/velcin

Plus en détail

WEA Un Gérant d'objets Persistants pour des environnements distribués

WEA Un Gérant d'objets Persistants pour des environnements distribués Thèse de Doctorat de l'université P & M Curie WEA Un Gérant d'objets Persistants pour des environnements distribués Didier Donsez Université Pierre et Marie Curie Paris VI Laboratoire de Méthodologie et

Plus en détail

Chapitre 2. Classes et objets

Chapitre 2. Classes et objets Chapitre 2: Classes et Objets 1/10 Chapitre 2 Classes et objets Chapitre 2: Classes et Objets 2/10 Approche Orientée Objet Idée de base de A.O.O. repose sur l'observation de la façon dont nous procédons

Plus en détail

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet TP Composants Java ME - Java EE Vous allez, dans ce TP, construire une architecture client serveur, plus précisément MIDlet cliente, servlet serveur. Pour cela, on va d'abord installer la partie serveur

Plus en détail

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Serveur d'archivage 2007 Installation et utilisation de la BD exist Type du document Procédure d'installation Auteur(s) Eric Bouladier Date de création 26/02/20007 Domaine de diffusion tous Validé par Equipe Versions Date Auteur(s) Modifications V1.00 26/02/2007 Eric Bouladier

Plus en détail

Accès aux bases de données

Accès aux bases de données 13 Accès aux bases de données Les bases de données fournissent un mécanisme de stockage persistant pour les données d application et dans bien des cas, elles sont essentielles au fonctionnement des applications.

Plus en détail

La magie de SVN. Découverte & usage du logiciel

La magie de SVN. Découverte & usage du logiciel La magie de SVN Découverte & usage du logiciel Menu I) SVN, qu'est-ce que c'est? 2) Comment utiliser SVN? 3) Que faire en cas de problème avec SVN? I) SVN, Qu'est-ce? -Un projet impliquant plusieurs personnes

Plus en détail

Corrigés des premiers exercices sur les classes

Corrigés des premiers exercices sur les classes Corrigés des premiers exercices sur les classes Exercice 2.1.1 utilisation d une classe Voici le texte d une classe représentant de façon sommaire un compte bancaire et les opérations bancaires courantes.

Plus en détail