Jc/md/lp-01/06Threads1. jc/md/lp-01/06Threads2 Objectif du chapitre Génération dune application avec thread –Création dun thread –Identification dun thread.

Slides:



Advertisements
Présentations similaires
La boucle for : init7.c et init71.c
Advertisements

Génération de plate-forme
Les fonctions A quoi ça sert ?
Rappels C.
Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
Synchronisation des processus père - fils
TP 7.1 synchronized et join Écrire un programme Java qui crée 1000 threads et maintient un compteur nb du nombre de threads créés jusque-là. Le thread.
Plan du cours 5:Threads introduction Définition Création des Threads
Liste générique dans Linux 2.6 Source : Understanding the Linux kernel Chap3 processes p.87.
Rappels de C ECP – Option SA Henri Fallon. Objectifs Théorie + pratique Compréhension générale du langage Repartant « du début » Pour ceux qui savent.
Exercice 1 1 (père) et 1 (fils) 1 (père) et 0 (fils)
jc/md/lp-01/05IT CE4.2 : cours1 Traitement des interruptions Cours.
Jc/md/lp-01/06Applications1 Émulateur. jc/md/lp-01/06Applications2 Objectif du chapitre Génération dapplications –WCE Console Application –WCE Application.
Jc/md/lp-01/06Génération de plate-forme1 Émulateur.
Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé
Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé
Jc/md/lp-01/06Synchronisation1. jc/md/lp-01/06Synchronisation2 Objectif du chapitre Création dune application ayant plusieurs threads Synchronisations.
Jc/md/lp-01/06Kernel Tracker1 Debugging Kernel Tracker.
Jc/md/lp-01/05TTY_IT : corrigé1 TTY_IT Corrigé. jc/md/lp-01/05TTY_IT : corrigé2 Objectif du chapitre Proposer une solution pour les exercices suggérés.
Jc/md/lp-01/05Driver élémentaire : corrigé1 Driver élémentaire Émulateur Corrigé
Jc/md/lp-01/05Trains_presentation1 Threads et Synchronisation Application train Présentation.
Jc/md/lp-01/05Internet Appliance1. jc/md/lp-01/05Internet Appliance2 Objectif du chapitre Réalisation dune plate-forme permettant laccès à Internet Paramétrages.
Jc/md/lp-01/06Installation de Platform Builder CE 4.21 Installation de Platform Builder.
Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.
Jc/md/lp-01/05Trains_corrigé1 Threads et Synchronisation Application train Corrigé
Cours n°1 Présenté par : Aurélien Baillard Aboubacar Camara Sébastien Simon Jeremy Landre Brown Ebiémi.
Windows XP Professionnel
Windows XP Professionnel
Lexplorer de Windows XP. Lexploreur de Windows Mes disques = Tiroirs ? Lexplorer de Windows Mais, où ai-je rangé ce (fichu) fichier ? Mais quand ai-je.
Introduction – Le bureau La visualisation des dossiers et des fichiers La gestion des dossiers et des fichiers Création dun nouveau dossier (méthode 1)
Le PROXY: l’identité Internet du CNUDST
Petite introduction au logiciel de traitement statistique SPSS
Système de gestion des demandes Création et consultation des billets
DIBA p r o g i c i e l. DIBA est un progiciel dédié à la gestion: des compagnies dassurance. des cabinets de courtage Il est entièrement paramétrable.
Processworks / 3DQuikForm Présentation Denis AUGUSTE Lycée de Lorgues.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Récursivité.
Processus et threads.
Un mini-compilateur Introduction à la syntaxe
HistoriqueHistorique Langage C++, parution du livre Bjarne Stroustrup Normalisation ANSI.
FICHIERS : Définition : Algorithme général:
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Programmation Orienté Objet Application Au Langage JAVA Licence professionnelle ATC ~ 07/08 Bessem BOURAOUI
Miguel Garzon CrUise Lab - SITE. Introduction Data Types and Sizes Constants Logic Operators Type conversions Example.
Multi-Thread Jian-Yun Nie
IFT 6800 Atelier en Technologies d’information
OpenCV: Introduction au Traitement d’Images et Vidéo
Cours 11 Threads. Chapitre X threads threadPOO-L3 H. Fauconnier3 Threads threads: plusieurs activités qui coexistent et partagent des données exemples:
Introduction au Langage C
Procédures et fonctions
Plan cours La notion de pointeur et d’adresse mémoire.
SYSTEME D’EXPLOITATION
2.1 - Historique Chapitre 2 : Introduction au langage C++
Les Pointeurs et les Tableaux Statiques et Tableaux Dynamiques
SIF-1053 Architecture des ordinateurs
1 Processus et threads Chapter Processus 2.2 Threads 2.3 Communication interprocessus 2.4 Problèmes classiques de communication 2.5 Ordonancement.
Argc et argv Utilisation des paramètres de la ligne de commande.
HistoriqueHistorique Langage C++, parution du livre Bjarne Stroustrup Normalisation ANSI.
Programmation Système et Réseau
8PRO100 Éléments de programmation Les pointeurs de caractères.
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Les variables fichiers. Le type fichier On manipule les fichiers par l’intermédiaire de structures FILE décrites dans stdio.h FILE *monFichier; –Nom physique.
Les entrées-sorties élémentaires
Lancement de Microsoft Word 1. Cliquer avec le bouton droit de la souris sur le raccourci de « Microsoft Office Word 2003 » sur le bureau, 2. Dans le menu.
1 UNIX AVANCE Yves PAGNOTTE – Janvier – LES PROCESSUS SOUS UNIX.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Informatique 2A Langage C 4ème séance
C++ Les fonctions. Présentation Utilité : Dès qu'un programme dépasse la centaine de lignes de code, il est pratique de pouvoir le décomposer en plusieurs.
A quoi sert la programmation? - indispensable pour plusieurs métiers. - passion. But du cours: - suite du cours Prog. Imp. I - fichiers, pointeurs, modularité.
Transcription de la présentation:

jc/md/lp-01/06Threads1

jc/md/lp-01/06Threads2 Objectif du chapitre Génération dune application avec thread –Création dun thread –Identification dun thread –Suspension/Reprise dun thread –Destruction dun thread –Contrôle de lexécution Exemples de threads

jc/md/lp-01/06Threads3 Point de départ Partir dune plate-forme de base pour émulateur de type « Industrial Controller » Construire (Build) la plate-forme Créer une application THREAD1 de type « Simple Windows CE Application »

jc/md/lp-01/06Threads4 Création de lapplication

jc/md/lp-01/06Threads5 Application THREAD1

jc/md/lp-01/06Threads6 Platform Settings

jc/md/lp-01/06Threads7 Création dun thread (1) Fonction CreateThread HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId); Valeur de retour : handle créé ou NULL

jc/md/lp-01/06Threads8 Création dun thread (2) : arguments lpThreadAttributes : NULL sous CE, dwStackSize : taille de la pile du thread créé lpStartAddress : pointeur sur le début du thread lpParameter : pointe une variable pour le thread dwCreationFlags : 0 pour démarrer le thread lpThreadId : pointeur sur une variable qui reçoit lidentificateur de thread, le ThreadId

jc/md/lp-01/06Threads9 Suspend/Resume Thread Gestion du compteur associé au thread Thread éligible quand ce compteur est nul Pour suspendre un thread DWORD SuspendThread( HANDLE hThread ); La fonction incrémente le compteur de mise en sommeil et retourne la valeur du compteur. Pour redémarrer un thread DWORD ResumeThread( HANDLE hThread ); La fonction décrémente le compteur de mise en sommeil et retourne la valeur du compteur.

jc/md/lp-01/06Threads10 Fin dun thread Pour terminer proprement un thread, le mieux est dutiliser la fonction ExitThread VOID ExitThread(DWORD dwExitCode); Le code de sortie est récupérable par celui qui a créé le thread par la fonction : BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode); Lappelant devra ensuite fermer le handle

jc/md/lp-01/06Threads11 Application THREAD1 Lapplication va créer un thread qui sera suspendu par la fonction Sleep La durée de la suspension est fixée par le paramètre fourni par CreateThread On vérifiera –Que le thread est actif en testant le code de retour 259 en décimal –Puis quil se termine en renvoyant un code de sortie différent, par exemple Enfin, CloseHandle ferme le handle

jc/md/lp-01/06Threads12 Génération de lapplication Fonction main THREAD1.cpp –Ouverture du fichier –Insertion du code de main Fonction A_MAIN –Insertion dun nouveau fichier THREAD1fonc.cpp dans le projet –Ouverture du fichier –Insertion du code de la fonction Compilation des fichiers.cpp Génération de lexécutable.exe

jc/md/lp-01/06Threads13 Ouverture de THREAD1.cpp Onglet FileView

jc/md/lp-01/06Threads14 THREAD1 main (1) #include "stdafx.h " #define ATTENTE 1000 void WINAPI A_MAIN(LPDWORD p); //déclaration fonction int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { HANDLE hFils; DWORD argument_pour_le_fils; //pour lexemple DWORD thread_fils_Id=0; LPDWORD lpThreadFilsId=&thread_fils_Id; DWORD code_mis_par_le_fils;

jc/md/lp-01/06Threads15 THREAD1 main (2) printf("WinMain: début du thread primaire de THREAD1\n"); argument_pour_le_fils=ATTENTE //en ms //Création du thread fils hFils=CreateThread( NULL,0, (LPTHREAD_START_ROUTINE)A_MAIN, &argument_pour_le_fils,0,lpThreadFilsId);

jc/md/lp-01/06Threads16 THREAD1 main (3) do //boucle dattente de la fin du thread fils { GetExitCodeThread(hFils,&code_mis_par_le_fils); //code actualisé à chaque passage printf("WinMain: code de retour du thread fils: %d\n",code_mis_par_le_fils); Sleep(400); //on redonne la main au système } while(code_mis_par_le_fils == STILL_ACTIVE);

jc/md/lp-01/06Threads17 THREAD1 main (4) printf("WinMain: fin de la boucle d'attente\n"); printf("WinMain: code de retour du thread fils : %d\n",code_mis_par_le_fils); CloseHandle(hFils); printf("WinMain: fin du thread primaire (main de THREAD1)\n"); getchar(); //attente d'un caractère pour maintenir la fenêtre ouverte return 0; }

jc/md/lp-01/06Threads18 Insertion dun fichier dans le projet

jc/md/lp-01/06Threads19 Type et nom du fichier inséré

jc/md/lp-01/06Threads20 Ouverture du nouveau fichier

jc/md/lp-01/06Threads21 Insertion du code de A_MAIN // THREAD1fonc.cpp #include "stdafx.h" //indispensable avec l'option /Yu du compilateur void WINAPI A_MAIN(LPDWORD pAdresse_argument) { DWORD attente; //utilisée pour une meilleure clarté printf("A_MAIN: début du thread fils\n"); attente=*pAdresse_argument; //récupération de largument printf("A_MAIN: argument envoyé par WinMain= %d\n",attente); Sleep(attente); printf("A_MAIN: fin du thread fils après attente de %d ms.\n",attente); ExitThread( ); //valeur arbitraire }

jc/md/lp-01/06Threads22 Insertion dun fichier existant

jc/md/lp-01/06Threads23 Chemin daccès au fichier

jc/md/lp-01/06Threads24 Après insertion du code

jc/md/lp-01/06Threads25 Génération de THREAD1.exe Build THREAD1.exe

jc/md/lp-01/06Threads26 Exécution de THREAD1 Vérifier la connexion et télécharger limage –TargetConfigure Remote Connexion… –TargetDownload/Initialize Choisir et exécuter THREAD1 –TargetRun Program Dans la boîte choisir Run Program choisir THREAD1.exe ou renseigner la zone Execution command line –Cliquer le bouton Run

jc/md/lp-01/06Threads27 Résultat de lexécution

jc/md/lp-01/06Threads28 Application THREAD2 Accès aux identificateurs de threads et aux handles par GetCurrentThreadId et GetCurrentThread –ThreadId du thread courant –ThreadId du père –ThreadId du fils SuspendThread ResumeThread

jc/md/lp-01/06Threads29 Application THREAD2 : Main Récupération du ThreadId Création dun pseudo-handle personnel Création du thread fils Impression des valeurs Réveil du thread fils après attente Lectures des codes de retour du fils Fermeture du handle fils Retour au système

jc/md/lp-01/06Threads30 THREAD2 main (1) // THREAD2.cpp //Defines the entry point for the appli. #include "stdafx.h" //obligatoire avec l'option de compil. /Yu #define ATTENTE 1000 //durée de l'attente void WINAPI A_MAIN (LPDWORD pAdresse_argument); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)

jc/md/lp-01/06Threads31 THREAD2 main (2) { HANDLE hFils; HANDLE hPere; DWORD threadId_pere=0; DWORD threadId_fils=0; LPDWORD lpThreadFilsId=&threadId_fils; DWORD code_mis_par_le_fils;

jc/md/lp-01/06Threads32 THREAD2 main (3) printf("WinMain: début du thread primaire de THREAD2\n"); hFils=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)A_M AIN,NULL,0,lpThreadFilsId); hPere=GetCurrentThread(); threadId_pere=GetCurrentThreadId(); printf("WinMain: handle_pere= %d handle_fils= %d\n",hPere,hFils); printf("WinMain: threadId_pere= %d threadId_fils= %d\n",threadId_pere,threadId_fils); Sleep(ATTENTE); ResumeThread(hFils);

jc/md/lp-01/06Threads33 THREAD2 main (4) GetExitCodeThread(hFils,&code_mis_par_le_fils); printf("WinMain: code de retour du thread fils : %d\n",code_mis_par_le_fils); Sleep(ATTENTE); GetExitCodeThread(hFils,&code_mis_par_le_fils); printf("WinMain: code de retour du thread fils : %d\n",code_mis_par_le_fils); CloseHandle(hFils); printf("WinMain: fin du thread primaire (main de THREAD2)\n"); getchar(); //attente d'un caractère pour… return (0); }

jc/md/lp-01/06Threads34 THREAD2 fonction #include "stdafx.h" //indispensable avec l'option /Yu… void WINAPI A_MAIN(LPDWORD pAdresse_argument) { DWORD threadId=0; HANDLE hLocal; hLocal=GetCurrentThread(); //crée un pseudo-handle threadId=GetCurrentThreadId(); printf("A_Main: threadId= %d hLocal= %d\n",threadId,hLocal); SuspendThread(hLocal); ExitThread( ); }

jc/md/lp-01/06Threads35 Mettre THREAD2 dans le noyau

jc/md/lp-01/06Threads36 MAKE IMAGE

jc/md/lp-01/06Threads37 Démarrer->Exécuter

jc/md/lp-01/06Threads38 Parcourir

jc/md/lp-01/06Threads39 Sélectionner THREAD2

jc/md/lp-01/06Threads40 OK

jc/md/lp-01/06Threads41 Résultat de lexécution

jc/md/lp-01/06Threads42 Application THREAD3 Dans une nouvelle application, THREAD3, nous allons remplacer dans TRHEAD2 le paramètre ATTENTE par une valeur lue sur la ligne de commande. Suppression du #define ATTENTE Remplacement des deux occurrences de ATTENTE par lappel à la fonction _wtoi() qui convertit la chaîne UNICODE donnée sur la ligne dattente en un entier Nous supposerons que le paramètre fourni sur la ligne de commande est saisi correctement, car le but est de montrer laccès à la ligne de commande et non de tester les chaînes proposées, soit par exemple 1000 ou On peut imprimer la valeur lue par un printf

jc/md/lp-01/06Threads43 THREAD3 main (1) Supprimer –#define ATTENTE 1000 Remplacer les deux occurrences de –Sleep(ATTENTE); par –Sleep(_wtoi(lpCmdLine); THREAD3fonc identique à THRED2fonc Générer la nouvelle image puis exécuter en renseignant la boîte dexécution avec le nom du programme suivi de 12345

jc/md/lp-01/06Threads44 Résultat de lexécution

jc/md/lp-01/06Threads45 Conclusion Nous appris à créer des threads et à organiser les communications élémentaires entre un thread père et un thread fils