1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] NATE HARDISON: Quand vous avez plusieurs programmes s'ouvrent sur un 2 00:00:09,360 --> 00:00:11,250 ordinateur, il semble que tout le 3 00:00:11,250 --> 00:00:12,880 exécute en même temps. 4 00:00:12,880 --> 00:00:15,350 Par exemple, vous pourriez travailler dans un navigateur Web, comme 5 00:00:15,350 --> 00:00:19,360 Firefox ou Internet Explorer, écouter de la musique sur iTunes, 6 00:00:19,360 --> 00:00:21,490 et rédiger une dissertation avec Word. 7 00:00:21,490 --> 00:00:24,240 Cependant, sous le capot, les programmes effectivement 8 00:00:24,240 --> 00:00:25,830 exécuter un à la fois. 9 00:00:25,830 --> 00:00:29,750 C'est le travail du système d'exploitation, Windows, Mac OSX, ou 10 00:00:29,750 --> 00:00:33,070 Linux, pour gérer chacun de ces processus distincts, selon le 11 00:00:33,070 --> 00:00:35,900 programmes sont connus, et basculer entre eux de sorte que lorsque vous 12 00:00:35,900 --> 00:00:38,610 passer de la vérification de votre page Facebook pour travailler sur votre essai 13 00:00:38,610 --> 00:00:41,590 , Word est celui qui est en cours d'exécution. 14 00:00:41,590 --> 00:00:44,890 >> Parfois, cependant, nous voulons des programmes eux-mêmes pour être en mesure 15 00:00:44,890 --> 00:00:47,440 de faire de multiples choses comme ça, aussi. 16 00:00:47,440 --> 00:00:49,630 Si vous êtes comme moi, vous avez probablement un tas de 17 00:00:49,630 --> 00:00:52,730 différents onglets s'ouvre dans votre navigateur Web, un pour le courrier électronique, 18 00:00:52,730 --> 00:00:55,070 une avec un calendrier, et ainsi de suite. 19 00:00:55,070 --> 00:00:58,270 Nous pourrions traiter chaque onglet, comme un programme distinct ou d'un processus, 20 00:00:58,270 --> 00:01:01,300 comme Google Chrome fait, mais de nombreux programmes utilisent une 21 00:01:01,300 --> 00:01:04,430 plus légère version d'un processus appelé un fil. 22 00:01:04,430 --> 00:01:07,190 >> Un fil est une autre unité de traitement, un ensemble d' 23 00:01:07,190 --> 00:01:10,100 instructions ou de codes qui peuvent "fonctionner", entre guillemets, 24 00:01:10,100 --> 00:01:12,560 en même temps que d'autres threads. 25 00:01:12,560 --> 00:01:15,150 C'est ce qui rend possible pour vous de naviguer Facebook 26 00:01:15,150 --> 00:01:17,940 tout en écoutant de moi dans l'arrière-plan ou d'avoir deux 27 00:01:17,940 --> 00:01:20,790 Des vidéos YouTube à jouer en même temps. 28 00:01:20,790 --> 00:01:24,660 Donc, ce thème général, connu sous le nom de concurrence, généralement 29 00:01:24,660 --> 00:01:26,930 ne se pose pas si tôt dans les cours d'informatique 30 00:01:26,930 --> 00:01:29,790 parce que les détails de bas niveau nécessitent une discussion de 31 00:01:29,790 --> 00:01:31,930 les systèmes d'exploitation et analogues. 32 00:01:31,930 --> 00:01:34,170 Cependant, le langage de programmation que nous utilisons à l' 33 00:01:34,170 --> 00:01:38,000 au début de la CS50, Scratch, fournit quelques outils amusants pour 34 00:01:38,000 --> 00:01:40,390 rendre plus facile d'écrire des programmes avec de multiples choses 35 00:01:40,390 --> 00:01:42,390 passe à la fois. 36 00:01:42,390 --> 00:01:45,050 >> Lorsque vous créez des programmes à gratter, vous êtes constamment 37 00:01:45,050 --> 00:01:46,760 travailler avec les threads. 38 00:01:46,760 --> 00:01:49,770 Chaque script Scratch, qui est un bloc de code qui commence par 39 00:01:49,770 --> 00:01:52,600 l'un des morceaux de puzzle «quand», peut être considéré 40 00:01:52,600 --> 00:01:54,380 comme un thread séparé. 41 00:01:54,380 --> 00:01:58,040 Regardons un programme Scratch simple pour voir comment cela fonctionne. 42 00:01:58,040 --> 00:02:01,730 >> Ici, nous avons un objet de poisson ou de sprite, avec deux scripts 43 00:02:01,730 --> 00:02:05,000 que les deux commencent lorsque l'on clique sur le bouton petit drapeau vert. 44 00:02:05,000 --> 00:02:07,290 Le premier script contrôle les mouvements du poisson. 45 00:02:07,290 --> 00:02:09,850 Lorsque le drapeau vert est cliqué, le poisson se placer 46 00:02:09,850 --> 00:02:12,450 sur le côté gauche de l'écran, appelé le stade, 47 00:02:12,450 --> 00:02:14,090 tourné vers la droite. 48 00:02:14,090 --> 00:02:17,070 Puis, dans un ensemble d'instructions qui fonctionnera pour toujours, jusqu'à ce que nous 49 00:02:17,070 --> 00:02:20,270 arrêter le programme, le poisson se glisse sur le côté droit, 50 00:02:20,270 --> 00:02:22,900 se retourne, remonte sur le côté gauche, et 51 00:02:22,900 --> 00:02:24,470 tourne autour de nouveau. 52 00:02:24,470 --> 00:02:27,410 Le second script contrôle processus de pensée du poisson. 53 00:02:27,410 --> 00:02:29,290 Il s'avère qu'il s'agit d'un poisson affamé. 54 00:02:29,290 --> 00:02:32,080 Donc, après avoir attendu pendant 3 secondes, le poisson va penser, 55 00:02:32,080 --> 00:02:34,420 «J'ai faim», pour une quatrième seconde. 56 00:02:34,420 --> 00:02:36,440 Ce script fonctionne également pour toujours. 57 00:02:36,440 --> 00:02:38,940 Et comme on voit, de l'exécution du programme en cliquant sur le 58 00:02:38,940 --> 00:02:41,730 drapeau vert, les deux scripts apparaissent pour exécuter 59 00:02:41,730 --> 00:02:43,100 simultanément. 60 00:02:43,100 --> 00:02:46,460 Le poisson se déplace et pense en même temps. 61 00:02:46,460 --> 00:02:49,030 >> Depuis le pauvre poisson ressemble tellement faim, nous allons ajouter un peu de 62 00:02:49,030 --> 00:02:50,670 bouffées de fromage pour manger. 63 00:02:50,670 --> 00:02:53,060 On peut espérer qu'ils ne se désintègrent dans l'eau. 64 00:02:53,060 --> 00:02:55,560 Lorsque nous ajoutons un sprite deuxième temps, nous allons aussi être en mesure de 65 00:02:55,560 --> 00:02:58,020 ajouter dans les scripts correspondant à cette sprite. 66 00:02:58,020 --> 00:02:59,580 Et, par conséquent, il y aura une autre série de 67 00:02:59,580 --> 00:03:00,830 fils qui allez rencontrer. 68 00:03:03,590 --> 00:03:06,270 Pour donner à l'utilisateur de notre programme de contrôle sur le moment où l' 69 00:03:06,270 --> 00:03:09,340 poissons affamés se nourriture, disons que chaque fois que l'espace 70 00:03:09,340 --> 00:03:11,840 Bar est touché, bouffées fromage apparaître sur la scène de l' 71 00:03:11,840 --> 00:03:13,300 poisson à manger. 72 00:03:13,300 --> 00:03:15,760 Avant de frapper la barre d'espace, nous voulons garder le fromage 73 00:03:15,760 --> 00:03:19,020 bouffées masquée, de sorte que le poisson ne peut pas les voir. 74 00:03:19,020 --> 00:03:21,140 Pour ce faire, nous aurons besoin de quelques scripts pour la 75 00:03:21,140 --> 00:03:22,750 bouffées fromage sprite. 76 00:03:22,750 --> 00:03:26,980 Le premier script, le drapeau vert, sera simplement cacher la nourriture. 77 00:03:26,980 --> 00:03:29,530 Contrairement aux autres scripts que nous avons écrit, celui-ci ne gardera pas 78 00:03:29,530 --> 00:03:30,560 fonctionne toujours. 79 00:03:30,560 --> 00:03:33,250 Il va commencer et terminer très rapidement, à droite quand on clique 80 00:03:33,250 --> 00:03:35,000 le bouton drapeau vert. 81 00:03:35,000 --> 00:03:37,180 >> Le script suivant va nous devons attendre que la barre d'espace pour être 82 00:03:37,180 --> 00:03:39,590 enfoncée avant de s'exécuter. 83 00:03:39,590 --> 00:03:42,770 Nous pouvons appeler attendre une entrée utilisateur "en attente" ou "écoute" 84 00:03:42,770 --> 00:03:43,860 pour un événement. 85 00:03:43,860 --> 00:03:46,750 Et le code qui s'exécute lorsque l'événement est reçu ou 86 00:03:46,750 --> 00:03:50,280 entendu est appelé code de gestion des événements. 87 00:03:50,280 --> 00:03:53,550 Notre gestionnaire d'événements Space Bar montrera les bouffées fromage sur 88 00:03:53,550 --> 00:03:56,330 l'écran afin que les poissons puissent les manger. 89 00:03:56,330 --> 00:03:58,880 À ce stade, tout se présente bien. 90 00:03:58,880 --> 00:04:00,990 >> La prochaine chose que nous devons faire est de trouver la façon d'obtenir 91 00:04:00,990 --> 00:04:03,570 le poisson se rendre compte qu'il ya à manger. 92 00:04:03,570 --> 00:04:06,030 Ajoutons un autre thread pour le poisson qui ne cessent de 93 00:04:06,030 --> 00:04:08,790 vérifie si ou non il est touchant les bouffées fromage. 94 00:04:08,790 --> 00:04:11,510 Nous faisons cela dans un thread séparé depuis cette manière, nous pouvons 95 00:04:11,510 --> 00:04:13,710 vérifier constamment de la nourriture. 96 00:04:13,710 --> 00:04:16,829 Dans le cas contraire, nous serions seulement être en mesure de vérifier périodiquement les aliments 97 00:04:16,829 --> 00:04:21,180 entre glisse, se retournant, d'attente, ou de penser. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Maintenant, nous allons lancer notre programme de Scratch. 100 00:04:23,785 --> 00:04:26,921 Comme prévu, la nourriture immédiatement cache et le 101 00:04:26,921 --> 00:04:28,920 nage des poissons affamés d'avant en arrière comme avant. 102 00:04:32,050 --> 00:04:35,060 Quand nous avons atteint la barre d'espace, les bouffées fromage venir en vue, 103 00:04:35,060 --> 00:04:37,470 et les poissons affamés dit whoo. 104 00:04:37,470 --> 00:04:39,340 Mais attendez, c'est bizarre. 105 00:04:39,340 --> 00:04:42,150 Comment se fait du poisson "j'ai faim" interrompt la pensée 106 00:04:42,150 --> 00:04:43,580 d'autres choses? 107 00:04:43,580 --> 00:04:45,780 C'est parce que nous n'avons pas établi une coordination 108 00:04:45,780 --> 00:04:47,590 entre les trois scénarios de poissons. 109 00:04:47,590 --> 00:04:50,610 Chaque s'exécute dans son propre thread, inconscient de ce qui l' 110 00:04:50,610 --> 00:04:52,120 que font les autres. 111 00:04:52,120 --> 00:04:54,980 Nous allons résoudre ce problème avant de passer. 112 00:04:54,980 --> 00:04:57,700 >> La coordination entre les threads est une tâche délicate car nous 113 00:04:57,700 --> 00:05:00,940 n'ont pas explicitement le contrôle sur le moment où chaque thread exécute ou 114 00:05:00,940 --> 00:05:02,190 ne fonctionne pas. 115 00:05:02,190 --> 00:05:04,710 Pour envoyer un message à partir d'un thread à l'autre, nous aurons besoin 116 00:05:04,710 --> 00:05:08,300 d'utiliser une variable que l'on peut définir, ni écrire, dans un fil 117 00:05:08,300 --> 00:05:10,170 et lire dans l'autre. 118 00:05:10,170 --> 00:05:12,920 Nous allons créer une variable appelée foodFound que nous pouvons mettre à 119 00:05:12,920 --> 00:05:15,530 vrai lorsque le poisson se jette dans les choux au fromage. 120 00:05:15,530 --> 00:05:17,540 Eh bien, bien sûr, nous voulons nous assurer que nous réglez-le sur 121 00:05:17,540 --> 00:05:19,240 false initialement. 122 00:05:19,240 --> 00:05:22,540 Puis, en fil de la pensée du poisson, nous allons vérifier pour voir si 123 00:05:22,540 --> 00:05:25,400 le poisson a trouvé de la nourriture avant d'afficher le "j'ai faim" 124 00:05:25,400 --> 00:05:26,770 pensée bulle. 125 00:05:26,770 --> 00:05:29,670 >> Maintenant, exécutez le programme à nouveau, nous voyons que le poisson 126 00:05:29,670 --> 00:05:31,580 ne soit pas interrompu par des pensées de la faim lorsque le 127 00:05:31,580 --> 00:05:33,820 bouffées fromage sont sortis. 128 00:05:33,820 --> 00:05:36,820 Le dernier problème que nous avons est que les bouffées fromage ne vont pas 129 00:05:36,820 --> 00:05:39,800 de suite après le poisson, GUILLEMETS, «mange» les. 130 00:05:39,800 --> 00:05:42,305 À partir des scripts de poissons, il n'y a pas de moyen facile de cacher le fromage 131 00:05:42,305 --> 00:05:44,710 bouffées, donc nous avons besoin d'envoyer un message aux choux au fromage 132 00:05:44,710 --> 00:05:46,780 sprite de se cacher. 133 00:05:46,780 --> 00:05:49,550 Nous pourrions le faire avec une autre variable que les bouffées fromage 134 00:05:49,550 --> 00:05:52,680 sprite a accès, ainsi que l'image-objet poisson. 135 00:05:52,680 --> 00:05:55,720 >> Cependant, il ya un moyen plus propre de le faire dans ce cas, 136 00:05:55,720 --> 00:05:57,840 depuis au lieu d'envoyer un message à un script qui est 137 00:05:57,840 --> 00:06:00,570 quelque part dans le milieu de l'exécution, nous pouvons envoyer le 138 00:06:00,570 --> 00:06:03,710 message à un script qui attend pour commencer. 139 00:06:03,710 --> 00:06:07,360 Nous faisons cela en ayant le poisson diffuser un événement, celui que nous allons 140 00:06:07,360 --> 00:06:08,800 appeler mangé. 141 00:06:08,800 --> 00:06:11,510 Ensuite, nous allons créer un script pour les bouffées fromage qui sera 142 00:06:11,510 --> 00:06:13,030 attendre pour cet événement. 143 00:06:13,030 --> 00:06:15,560 Ceci est similaire à l'événement barre d'espace, sauf que cette 144 00:06:15,560 --> 00:06:19,250 temps, l'utilisateur n'est pas celui qui est directement déclenchement de l'événement. 145 00:06:19,250 --> 00:06:22,800 Maintenant tout ce que nous avons à faire est de configurer notre dossier variable foodFound 146 00:06:22,800 --> 00:06:25,750 à faux, et nous pouvons maintenant donner du poisson affamé que de nombreux 147 00:06:25,750 --> 00:06:28,470 portions de fromage bouffées qu'il le souhaite. 148 00:06:28,470 --> 00:06:30,040 >> Donc, pas trop mal, non? 149 00:06:30,040 --> 00:06:33,400 En C, l'écriture programmes multi-threads est plus compliquée, 150 00:06:33,400 --> 00:06:35,700 mais les bases sont les mêmes. 151 00:06:35,700 --> 00:06:38,690 Quoi qu'il en soit, j'espère que vous avez un bon moment la construction de l'amusement 152 00:06:38,690 --> 00:06:41,030 programmes concurrents dans Scratch. 153 00:06:41,030 --> 00:06:42,570 Mon nom est Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 C'est CS50.