1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] NATE Hardison: När du har flera program öppna på en 2 00:00:09,360 --> 00:00:11,250 dator, det verkar som allt är 3 00:00:11,250 --> 00:00:12,880 körs samtidigt. 4 00:00:12,880 --> 00:00:15,350 Till exempel kanske du arbetar i en webbläsare som 5 00:00:15,350 --> 00:00:19,360 Firefox eller Internet Explorer, lyssna på musik på iTunes, 6 00:00:19,360 --> 00:00:21,490 och skriva en uppsats med Word. 7 00:00:21,490 --> 00:00:24,240 Men under huven, de program som faktiskt 8 00:00:24,240 --> 00:00:25,830 köra en åt gången. 9 00:00:25,830 --> 00:00:29,750 Det är en uppgift för operativsystemet Windows, Mac OSX, eller 10 00:00:29,750 --> 00:00:33,070 Linux att hantera varje av dessa separata processer, som 11 00:00:33,070 --> 00:00:35,900 program är kända och växla mellan dem så att när du 12 00:00:35,900 --> 00:00:38,610 gå från att kontrollera din Facebook-sida att arbeta på din uppsats 13 00:00:38,610 --> 00:00:41,590 igen, är Word ett som kör. 14 00:00:41,590 --> 00:00:44,890 >> Men ibland vill vi själva programmen ska kunna 15 00:00:44,890 --> 00:00:47,440 att göra flera saker som detta också. 16 00:00:47,440 --> 00:00:49,630 Om du är som jag, har du förmodligen en massa 17 00:00:49,630 --> 00:00:52,730 olika flikar öppna i din webbläsare, en för e-post, 18 00:00:52,730 --> 00:00:55,070 en med en kalender, och så vidare. 19 00:00:55,070 --> 00:00:58,270 Vi kunde behandla varje flik som ett separat program eller process, 20 00:00:58,270 --> 00:01:01,300 som Google Chrome gör, men många program använder 21 00:01:01,300 --> 00:01:04,430 lättare vikt version av en process som kallas en tråd. 22 00:01:04,430 --> 00:01:07,190 >> En tråd är bara en annan enhet för bearbetning, en uppsättning 23 00:01:07,190 --> 00:01:10,100 instruktioner eller kod som kan "köra", citat citat, 24 00:01:10,100 --> 00:01:12,560 samtidigt med andra trådar. 25 00:01:12,560 --> 00:01:15,150 Det är det som gör det möjligt för dig att bläddra Facebook 26 00:01:15,150 --> 00:01:17,940 medan du lyssnar på mig i bakgrunden eller att ha två 27 00:01:17,940 --> 00:01:20,790 YouTube-videor att spela på samma gång. 28 00:01:20,790 --> 00:01:24,660 Så denna allmänna fråga, som kallas samtidighet, typiskt 29 00:01:24,660 --> 00:01:26,930 kommer inte upp så tidigt i datavetenskap kurser 30 00:01:26,930 --> 00:01:29,790 eftersom de lägre nivå detaljer kräver diskussion om 31 00:01:29,790 --> 00:01:31,930 operativsystem och liknande. 32 00:01:31,930 --> 00:01:34,170 Men programmeringsspråk vi använder på 33 00:01:34,170 --> 00:01:38,000 början av CS50, Scratch ger några fiffiga verktyg för att 34 00:01:38,000 --> 00:01:40,390 göra det lättare att skriva program med flera saker 35 00:01:40,390 --> 00:01:42,390 händer på en gång. 36 00:01:42,390 --> 00:01:45,050 >> När du bygger Scratch program, du ständigt 37 00:01:45,050 --> 00:01:46,760 arbetar med gängor. 38 00:01:46,760 --> 00:01:49,770 Varje Scratch skript, vilket är ett kodblock som börjar med 39 00:01:49,770 --> 00:01:52,600 en av de "när" pusselbitar, kan betraktas 40 00:01:52,600 --> 00:01:54,380 som en separat tråd. 41 00:01:54,380 --> 00:01:58,040 Låt oss titta på ett enkelt Scratch för att se hur det fungerar. 42 00:01:58,040 --> 00:02:01,730 >> Här har vi en fisk objekt eller sprite, med två manus 43 00:02:01,730 --> 00:02:05,000 att både start när vi klickar på den lilla gröna flaggan knappen. 44 00:02:05,000 --> 00:02:07,290 Det första skriptet kontrollerar fiskens rörelse. 45 00:02:07,290 --> 00:02:09,850 När den gröna flaggan klickas, blir fiskar 46 00:02:09,850 --> 00:02:12,450 på vänster sida av skärmen, som kallas scenen, 47 00:02:12,450 --> 00:02:14,090 vänd åt höger. 48 00:02:14,090 --> 00:02:17,070 Då, i en uppsättning instruktioner som ska köra för evigt, tills vi 49 00:02:17,070 --> 00:02:20,270 avbryta programmet, glider fisken till höger, 50 00:02:20,270 --> 00:02:22,900 vänder, går tillbaka till den vänstra sidan, och 51 00:02:22,900 --> 00:02:24,470 vänder igen. 52 00:02:24,470 --> 00:02:27,410 Det andra skriptet kontrollerar fiskens tankeprocess. 53 00:02:27,410 --> 00:02:29,290 Det visar sig att detta är en hungrig fisk. 54 00:02:29,290 --> 00:02:32,080 Så efter att ha väntat i 3 sekunder, kommer fisken tänka, 55 00:02:32,080 --> 00:02:34,420 "Jag är hungrig", för kvart sekund. 56 00:02:34,420 --> 00:02:36,440 Detta skript körs också alltid. 57 00:02:36,440 --> 00:02:38,940 Och som vi ser, från att köra programmet genom att klicka på 58 00:02:38,940 --> 00:02:41,730 gröna flaggan, både manus verkar exekvera 59 00:02:41,730 --> 00:02:43,100 samtidigt. 60 00:02:43,100 --> 00:02:46,460 Fisken rör sig och tänker på samma gång. 61 00:02:46,460 --> 00:02:49,030 >> Eftersom den stackars fisken ser så hungrig, låt oss lägga i några 62 00:02:49,030 --> 00:02:50,670 ostliknande puffar för att äta. 63 00:02:50,670 --> 00:02:53,060 Förhoppningsvis kommer de inte sönderdelas i vattnet. 64 00:02:53,060 --> 00:02:55,560 När vi lägger i en andra sprite kommer vi också att kunna 65 00:02:55,560 --> 00:02:58,020 Lägg i skript som motsvarar den spriten. 66 00:02:58,020 --> 00:02:59,580 Och följaktligen, kommer det finnas en annan uppsättning av 67 00:02:59,580 --> 00:03:00,830 trådar som springer. 68 00:03:03,590 --> 00:03:06,270 Att ge användaren av vårt program kontroll över när 69 00:03:06,270 --> 00:03:09,340 hungrig fisk får mat, låt oss säga att närhelst Space 70 00:03:09,340 --> 00:03:11,840 Bar träffas, ostliknande puffar visas på scenen för 71 00:03:11,840 --> 00:03:13,300 fisk att äta. 72 00:03:13,300 --> 00:03:15,760 Innan vi slår på mellanslagstangenten, kommer vi vill behålla ostliknande 73 00:03:15,760 --> 00:03:19,020 puffar gömd så att fisken inte kan se dem. 74 00:03:19,020 --> 00:03:21,140 För att göra detta behöver vi ett par skript för 75 00:03:21,140 --> 00:03:22,750 ostliknande puffar sprite. 76 00:03:22,750 --> 00:03:26,980 Den första manus, den gröna flaggan, kommer bara dölja maten. 77 00:03:26,980 --> 00:03:29,530 Till skillnad från de andra skript vi har skrivit, kommer detta ett håller inte 78 00:03:29,530 --> 00:03:30,560 kör alltid. 79 00:03:30,560 --> 00:03:33,250 Det kommer att börja och sluta mycket snabbt, precis när vi klickar 80 00:03:33,250 --> 00:03:35,000 den gröna flaggan knappen. 81 00:03:35,000 --> 00:03:37,180 >> Nästa manus vi har att vänta på mellanslagstangenten för att vara 82 00:03:37,180 --> 00:03:39,590 trycks före körning. 83 00:03:39,590 --> 00:03:42,770 Vi kan kalla väntar användarinmatning "väntar" eller "lyssna" 84 00:03:42,770 --> 00:03:43,860 för en händelse. 85 00:03:43,860 --> 00:03:46,750 Och den kod som körs när en händelse tas emot eller 86 00:03:46,750 --> 00:03:50,280 hört kallas händelsehantering kod. 87 00:03:50,280 --> 00:03:53,550 Vår Mellanslag händelsehanterare kommer att visa ostliknande puffar på 88 00:03:53,550 --> 00:03:56,330 skärmen så att fisken kan äta dem. 89 00:03:56,330 --> 00:03:58,880 Vid denna punkt, är allt ser bra ut. 90 00:03:58,880 --> 00:04:00,990 >> Nästa sak vi behöver göra är att ta reda på hur man får 91 00:04:00,990 --> 00:04:03,570 fisken att inse att det finns mat att äta. 92 00:04:03,570 --> 00:04:06,030 Låt oss lägga till ytterligare tråd till fisken som ständigt 93 00:04:06,030 --> 00:04:08,790 kontrollerar om det är vidrör den ostliknande puffar. 94 00:04:08,790 --> 00:04:11,510 Vi gör detta i en separat tråd eftersom det sättet vi kan 95 00:04:11,510 --> 00:04:13,710 ständigt kontrollera mat. 96 00:04:13,710 --> 00:04:16,829 Annars skulle vi bara kunna regelbundet kontrollera för mat 97 00:04:16,829 --> 00:04:21,180 mellan segelflyg, vända, väntar eller tänka. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Nu ska vi köra vårt Scratch-program. 100 00:04:23,785 --> 00:04:26,921 Som väntat döljer maten omedelbart och 101 00:04:26,921 --> 00:04:28,920 hungrig fisk simmar fram och tillbaka precis som förr. 102 00:04:32,050 --> 00:04:35,060 När vi träffar på mellanslagstangenten, de ostliknande puffar kommer i sikte, 103 00:04:35,060 --> 00:04:37,470 och hungriga fiskar säger Whoo. 104 00:04:37,470 --> 00:04:39,340 Men vänta, det är konstigt. 105 00:04:39,340 --> 00:04:42,150 Hur kommer fiskens "Jag är hungrig" tanke avbryter 106 00:04:42,150 --> 00:04:43,580 andra saker? 107 00:04:43,580 --> 00:04:45,780 Detta beror på att vi inte fastställa någon samordning 108 00:04:45,780 --> 00:04:47,590 mellan de tre fiskar skript. 109 00:04:47,590 --> 00:04:50,610 Varje körs i sin egen tråd, omedvetna om vad 110 00:04:50,610 --> 00:04:52,120 andra gör. 111 00:04:52,120 --> 00:04:54,980 Låt oss fixa detta innan vi går vidare. 112 00:04:54,980 --> 00:04:57,700 >> Samordning mellan trådar är en svår uppgift eftersom vi 113 00:04:57,700 --> 00:05:00,940 inte har explicit kontroll över när varje tråd löper eller 114 00:05:00,940 --> 00:05:02,190 går inte. 115 00:05:02,190 --> 00:05:04,710 Om du vill skicka ett meddelande från en tråd till en annan, behöver vi 116 00:05:04,710 --> 00:05:08,300 att använda en variabel som vi kan ställa, eller skriva i en tråd 117 00:05:08,300 --> 00:05:10,170 och läsa i den andra. 118 00:05:10,170 --> 00:05:12,920 Låt oss skapa en variabel som heter foodFound som vi kan ställa till 119 00:05:12,920 --> 00:05:15,530 sant när fisken rusar in i ostliknande blossen. 120 00:05:15,530 --> 00:05:17,540 Jo, naturligtvis vill vi se till att vi satt det 121 00:05:17,540 --> 00:05:19,240 falsk initialt. 122 00:05:19,240 --> 00:05:22,540 Då, i fiskens tänkande tråd, vi kontrollera om 123 00:05:22,540 --> 00:05:25,400 fisken har hittat mat innan visar "Jag är hungrig" 124 00:05:25,400 --> 00:05:26,770 tankebubbla. 125 00:05:26,770 --> 00:05:29,670 >> Nu kör programmet igen, ser vi att fisken 126 00:05:29,670 --> 00:05:31,580 inte bli avbruten med tankar på hunger när 127 00:05:31,580 --> 00:05:33,820 ostliknande puffar är ute. 128 00:05:33,820 --> 00:05:36,820 Det sista problemet vi har är att de ostliknande puffar inte går 129 00:05:36,820 --> 00:05:39,800 bort efter fisken, citerar unquote, "äter" dem. 130 00:05:39,800 --> 00:05:42,305 Från fisken skript, det finns inget enkelt sätt att dölja ostliknande 131 00:05:42,305 --> 00:05:44,710 puffar, så vi måste sända ett budskap till de ostliknande blossen 132 00:05:44,710 --> 00:05:46,780 sprite att gömma sig. 133 00:05:46,780 --> 00:05:49,550 Vi kan göra detta med en annan variabel att ostliknande puffar 134 00:05:49,550 --> 00:05:52,680 sprite har tillgång till, samt fisk spriten. 135 00:05:52,680 --> 00:05:55,720 >> Men det finns ett renare sätt att göra det i det här fallet, 136 00:05:55,720 --> 00:05:57,840 eftersom istället för att skicka ett meddelande till ett manus som är 137 00:05:57,840 --> 00:06:00,570 någonstans i mitten av utförande, kan vi skicka 138 00:06:00,570 --> 00:06:03,710 budskap till ett skript som väntar på att starta. 139 00:06:03,710 --> 00:06:07,360 Vi gör detta genom att ha fisken sända ett evenemang, en vi ska 140 00:06:07,360 --> 00:06:08,800 samtal ätit. 141 00:06:08,800 --> 00:06:11,510 Sedan kommer vi att skapa ett manus för de ostliknande puffar som kommer 142 00:06:11,510 --> 00:06:13,030 vänta för detta evenemang. 143 00:06:13,030 --> 00:06:15,560 Detta liknar mellanslagstangenten händelsen, förutom att det 144 00:06:15,560 --> 00:06:19,250 tid, är användaren inte en direkt utlöser händelsen. 145 00:06:19,250 --> 00:06:22,800 Nu allt vi behöver göra är att ställa vår foodFound variabel tillbaka 146 00:06:22,800 --> 00:06:25,750 till false, och vi kan nu ge de hungriga fiskar så många 147 00:06:25,750 --> 00:06:28,470 portioner av ostliknande puffar som det vill. 148 00:06:28,470 --> 00:06:30,040 >> Så inte alltför illa, eller hur? 149 00:06:30,040 --> 00:06:33,400 I C, skriver flertrådade program är mer komplicerad, 150 00:06:33,400 --> 00:06:35,700 men grunderna är desamma. 151 00:06:35,700 --> 00:06:38,690 Hur som helst, jag hoppas du har en fantastisk tid att bygga lite kul 152 00:06:38,690 --> 00:06:41,030 parallella program i grunden. 153 00:06:41,030 --> 00:06:42,570 Mitt namn är Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 Detta är CS50.