;;; threads.rkt, (jpr), Printemps 2017, L1-Info ;;; ;;; ATTENTION : ce fichier n'est pas en mode "Etudiant Avancé" mais en full Racket ;;; (cf livre PCPS chapitre 11). Donc plus de teachpack "valrose.rkt", ou alors il ;;; faut le demander par un require... ;;; Ce fichier est sauvé en mode "Déterminer le langage à partir du code-source", ;;; autrement dit, c'est le #lang qui indique le niveau de langage ! #lang racket ; niveau racket, je lâche la bête :-) (require net/sendurl) ;;; J'ai envie de lancer deux animations en même temps, dans deux scènes séparées. ;;; Ce n'est pas possible en "Etudiant Avancé" car le big-bang est bloquant : il ne ;;; rend la main qu'à la fin (manuelle ou automatique) d'une animation. Nous nous ;;; plaçons donc en langage "racket" qui contient tout ce qu'il faut pour programmer ;;; (internet, classes et objets, fichiers, appels système à Unix, threads, etc). ;;; Tout sauf les "interfaces graphiques" (GUI : fenêtres, boutons, souris, etc ;;; comme tkinter en Python). Pour cela il faudrait se mettre en langage "racket/gui" ;;; (cf PCPS §14.4). Nous ne le ferons pas ici, restons concentrés sur le big-bang. ;;; Je dois requérir les outils du big-bang car "valrose.rkt" n'est plus avec notre esprit. (require 2htdp/image) ; les images (require 2htdp/universe) ; les animations ;;; Une première animation (define FOND (rectangle 200 200 'solid "yellow")) (define (anim1) ; le monde est le nombre t de ticks depuis le début (local [(define (suivant t) (+ t 1)) (define (dessiner t) (underlay FOND (circle (* 100 (abs (sin (* 1/20 t)))) 'solid "red")))] (big-bang 0 (on-tick suivant) (on-draw dessiner)))) ;;; Une seconde animation (define (anim2) (local [(define (suivant t) (+ t 1)) (define (dessiner t) (underlay FOND (circle (* 100 (abs (sin (* 1/40 t)))) 'solid "blue")))] (big-bang 0 (on-tick suivant) (on-draw dessiner)))) ;;; Si je lance (anim1) je suis obligé de terminer l'animation en cliquant dans la ;;; case de fermeture de sa fenêtre pour lancer la seconde. Processus bloquant ! ;;; Vous avez fait le cours "Système", vous avez entendu parler des "processus". Parmi ;;; ceux-ci se trouvent les "processus légers" ou "threads" dont l'étude approfondie ;;; est faite en L2-L3. Hors de question donc d'entrer dans les détails. (send-url "https://fr.wikipedia.org/wiki/Thread_(informatique)") (send-url "https://docs.racket-lang.org/reference/threads.html") ;;; Les threads n'implémentent pas du "parallélisme" mais de la "concurrence". Le ;;; véritable parallélisme exige plusieurs processeurs (par exemple si votre ;;; ordinateur comporte plusieurs coeurs). La parallélisme est possible en Racket. ;;; D'ailleurs lorsque vous installez un paquetage (par exemple Rsound), la fenêtre ;;; vous dit qu'il est en mode "parallel-build" pour construire la documentation html. (send-url "https://docs.racket-lang.org/guide/parallelism.html") ;;; Pour lancer deux animations concurrentes, il suffit de lancer chacune dans son ;;; propre thread : anim1 dans le thread t1 et anim2 dans le thread t2. La fonction ;;; 'thread' *asynchrone* de Racket crée un nouveau fil d'exécution dans lequel va ;;; s'exécuter une lambda d'arité 0 (un "thunk" comme on dit en programmation). (define t1 (thread anim1)) (define t2 (thread anim2)) ;;; Amusez-vous bien...