1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] NATE Hardison: Når du har flere programmer åpne på en 2 00:00:09,360 --> 00:00:11,250 datamaskin, virker det som alt er 3 00:00:11,250 --> 00:00:12,880 kjører på samme tid. 4 00:00:12,880 --> 00:00:15,350 For eksempel kan du jobbe i en nettleser som 5 00:00:15,350 --> 00:00:19,360 Firefox eller Internet Explorer, lytte til musikk på iTunes, 6 00:00:19,360 --> 00:00:21,490 og skrive et essay med Word. 7 00:00:21,490 --> 00:00:24,240 Men under panseret, programmene faktisk 8 00:00:24,240 --> 00:00:25,830 kjøre en om gangen. 9 00:00:25,830 --> 00:00:29,750 Det er jobben av operativsystemet, Windows, Mac OSX, eller 10 00:00:29,750 --> 00:00:33,070 Linux, å administrere hver av disse separate prosesser, som 11 00:00:33,070 --> 00:00:35,900 programmer er kjent, og veksle mellom dem, slik at når du 12 00:00:35,900 --> 00:00:38,610 gå fra å sjekke din Facebook-side til å jobbe på essayet ditt 13 00:00:38,610 --> 00:00:41,590 igjen, er Word den som kjører. 14 00:00:41,590 --> 00:00:44,890 >> Noen ganger, skjønt, vil vi programmer selv å være i stand 15 00:00:44,890 --> 00:00:47,440 å gjøre flere ting som dette, også. 16 00:00:47,440 --> 00:00:49,630 Hvis du er som meg, har du sannsynligvis en haug med 17 00:00:49,630 --> 00:00:52,730 forskjellige faner åpne i nettleseren din, en for e-post, 18 00:00:52,730 --> 00:00:55,070 en med en kalender, og så videre. 19 00:00:55,070 --> 00:00:58,270 Vi kunne behandle hver kategori som et eget program eller prosess, 20 00:00:58,270 --> 00:01:01,300 som Google Chrome gjør, men mange programmer bruker en 21 00:01:01,300 --> 00:01:04,430 lettere vekt versjon av en prosess kalt en tråd. 22 00:01:04,430 --> 00:01:07,190 >> En tråd er bare en annen enhet av behandling, et sett av 23 00:01:07,190 --> 00:01:10,100 instruksjoner eller koder som kan "kjøre", sitat unquote, 24 00:01:10,100 --> 00:01:12,560 samtidig med andre tråder. 25 00:01:12,560 --> 00:01:15,150 Dette er det som gjør det mulig for deg å bla Facebook 26 00:01:15,150 --> 00:01:17,940 mens du lytter til meg i bakgrunnen eller å ha to 27 00:01:17,940 --> 00:01:20,790 YouTube-videoer å spille på samme tid. 28 00:01:20,790 --> 00:01:24,660 Så, denne generelle tema, kjent som samtidighet, typisk 29 00:01:24,660 --> 00:01:26,930 kommer ikke opp så tidlig i informatikk kurs 30 00:01:26,930 --> 00:01:29,790 fordi lavere nivå detaljer krever drøfting av 31 00:01:29,790 --> 00:01:31,930 operativsystemer og lignende. 32 00:01:31,930 --> 00:01:34,170 Men programmeringsspråket vi bruker på 33 00:01:34,170 --> 00:01:38,000 begynnelsen av CS50, Scratch, gir noen smarte verktøy for å 34 00:01:38,000 --> 00:01:40,390 gjøre det enklere å skrive programmer med flere ting 35 00:01:40,390 --> 00:01:42,390 skjer på en gang. 36 00:01:42,390 --> 00:01:45,050 >> Når du bygger Scratch programmer, er du hele tiden 37 00:01:45,050 --> 00:01:46,760 arbeider med tråder. 38 00:01:46,760 --> 00:01:49,770 Hver Scratch script, som er en kode blokk som begynner med 39 00:01:49,770 --> 00:01:52,600 en av de "når" puslespillbiter, kan tenkte på 40 00:01:52,600 --> 00:01:54,380 som en separat tråd. 41 00:01:54,380 --> 00:01:58,040 La oss se på et enkelt Scratch program for å se hvordan dette fungerer. 42 00:01:58,040 --> 00:02:01,730 >> Her har vi en fisk objekt, eller sprite, med to skript 43 00:02:01,730 --> 00:02:05,000 at både start når vi klikker den lille grønne flagg-knappen. 44 00:02:05,000 --> 00:02:07,290 Det første manuset styrer fiskens bevegelse. 45 00:02:07,290 --> 00:02:09,850 Når den grønne flagget er klikket, blir fisken plassert 46 00:02:09,850 --> 00:02:12,450 på venstre side av skjermen, kalt scenen, 47 00:02:12,450 --> 00:02:14,090 mot høyre. 48 00:02:14,090 --> 00:02:17,070 Så, i et sett med instruksjoner som skal kjøre evig, før vi 49 00:02:17,070 --> 00:02:20,270 stoppe programmet, glir fisken til høyre side, 50 00:02:20,270 --> 00:02:22,900 snur seg, går tilbake til venstre side, og 51 00:02:22,900 --> 00:02:24,470 snur seg igjen. 52 00:02:24,470 --> 00:02:27,410 Det andre skriptet kontrollerer fiskens tankeprosess. 53 00:02:27,410 --> 00:02:29,290 Det viser seg at dette er en sulten fisk. 54 00:02:29,290 --> 00:02:32,080 Så etter å ha ventet i 3 sekunder, vil fisken tenke, 55 00:02:32,080 --> 00:02:34,420 "Jeg er sulten," for en fjerde sekund. 56 00:02:34,420 --> 00:02:36,440 Dette skriptet kjører også alltid. 57 00:02:36,440 --> 00:02:38,940 Og som vi ser, fra å kjøre programmet ved å klikke på 58 00:02:38,940 --> 00:02:41,730 grønt flagg, både skript synes å utføre 59 00:02:41,730 --> 00:02:43,100 samtidig. 60 00:02:43,100 --> 00:02:46,460 Fisken beveger og tenker samtidig. 61 00:02:46,460 --> 00:02:49,030 >> Siden dårlig fisk ser så sulten, la oss legge inn noen 62 00:02:49,030 --> 00:02:50,670 cheesy puffs for det å spise. 63 00:02:50,670 --> 00:02:53,060 Forhåpentligvis de ikke vil gå i oppløsning i vannet. 64 00:02:53,060 --> 00:02:55,560 Når vi legger til i en annen sprite, vil vi også kunne 65 00:02:55,560 --> 00:02:58,020 legge i skript som samsvarer med den sprite. 66 00:02:58,020 --> 00:02:59,580 Og dermed vil det være et annet sett med 67 00:02:59,580 --> 00:03:00,830 tråder som vil kjøre. 68 00:03:03,590 --> 00:03:06,270 Å gi brukeren av vårt program kontroll over når 69 00:03:06,270 --> 00:03:09,340 sulten fisk får mat, la oss si at når Space 70 00:03:09,340 --> 00:03:11,840 Bar er truffet, cheesy puffs vises på scenen for 71 00:03:11,840 --> 00:03:13,300 fisk å spise. 72 00:03:13,300 --> 00:03:15,760 Før vi treffer Space Bar, vil vi ønsker å beholde den cheesy 73 00:03:15,760 --> 00:03:19,020 puffs skjult slik at fisken ikke kan se dem. 74 00:03:19,020 --> 00:03:21,140 For å gjøre dette, trenger vi et par av skript for 75 00:03:21,140 --> 00:03:22,750 cheesy puffs sprite. 76 00:03:22,750 --> 00:03:26,980 Det første skriptet, den grønne flagg, vil bare gjemme maten. 77 00:03:26,980 --> 00:03:29,530 I motsetning til de andre skriptene vi har skrevet, vil dette ikke holde 78 00:03:29,530 --> 00:03:30,560 kjører alltid. 79 00:03:30,560 --> 00:03:33,250 Det vil starte og avslutte veldig raskt, akkurat når vi klikker 80 00:03:33,250 --> 00:03:35,000 grønt flagg-knappen. 81 00:03:35,000 --> 00:03:37,180 >> Den neste script vi har vil vente på Space Bar å være 82 00:03:37,180 --> 00:03:39,590 trykket før du utfører. 83 00:03:39,590 --> 00:03:42,770 Vi kan kalle venter på brukerens input "venter" eller "lytte" 84 00:03:42,770 --> 00:03:43,860 for en hendelse. 85 00:03:43,860 --> 00:03:46,750 Og koden som utføres når en hendelse blir mottatt eller 86 00:03:46,750 --> 00:03:50,280 hørt kalles event håndtering kode. 87 00:03:50,280 --> 00:03:53,550 Vår Space Bar hendelseshåndterer vil vise cheesy puffs på 88 00:03:53,550 --> 00:03:56,330 skjermen slik at fisken kan spise dem. 89 00:03:56,330 --> 00:03:58,880 På dette punktet, er alt ser bra ut. 90 00:03:58,880 --> 00:04:00,990 >> Det neste vi må gjøre er å finne ut hvordan du får 91 00:04:00,990 --> 00:04:03,570 fisken til å innse at det er mat å spise. 92 00:04:03,570 --> 00:04:06,030 La oss legge til en annen tråd til fisken som stadig 93 00:04:06,030 --> 00:04:08,790 sjekker om det er rørende cheesy puffs. 94 00:04:08,790 --> 00:04:11,510 Vi gjør dette i en egen tråd siden den måten vi kan 95 00:04:11,510 --> 00:04:13,710 hele tiden se etter mat. 96 00:04:13,710 --> 00:04:16,829 Ellers ville vi bare kunne jevnlig se etter mat 97 00:04:16,829 --> 00:04:21,180 i mellom gliding, snu, venter eller tenker. 98 00:04:21,180 --> 00:04:22,000 >> OK. 99 00:04:22,000 --> 00:04:23,785 Nå la oss kjøre vår Scratch program. 100 00:04:23,785 --> 00:04:26,921 Som forventet, maten umiddelbart skjuler og 101 00:04:26,921 --> 00:04:28,920 sulten fisk svømmer frem og tilbake akkurat som før. 102 00:04:32,050 --> 00:04:35,060 Når vi treffer Space Bar, cheesy puffs kommer til syne, 103 00:04:35,060 --> 00:04:37,470 og sulten fisk sier Whoo. 104 00:04:37,470 --> 00:04:39,340 Men vent, det er rart. 105 00:04:39,340 --> 00:04:42,150 Hvordan kommer fiskens "Jeg er sulten" tenkte avbryter 106 00:04:42,150 --> 00:04:43,580 andre ting? 107 00:04:43,580 --> 00:04:45,780 Dette er fordi vi ikke etablere noen samordning 108 00:04:45,780 --> 00:04:47,590 mellom de tre fisk skript. 109 00:04:47,590 --> 00:04:50,610 Hver kjører i sin egen tråd, uvitende om hva 110 00:04:50,610 --> 00:04:52,120 andre gjør. 111 00:04:52,120 --> 00:04:54,980 La oss fikse dette før vi går videre. 112 00:04:54,980 --> 00:04:57,700 >> Samordning mellom tråder er en vanskelig oppgave, siden vi 113 00:04:57,700 --> 00:05:00,940 har ikke eksplisitt kontroll over når hver tråd løper eller 114 00:05:00,940 --> 00:05:02,190 går ikke. 115 00:05:02,190 --> 00:05:04,710 Slik sender du en melding fra en tråd til en annen, må vi 116 00:05:04,710 --> 00:05:08,300 å bruke en variabel som vi kan sette, eller skrive, i en tråd 117 00:05:08,300 --> 00:05:10,170 og lese i den andre. 118 00:05:10,170 --> 00:05:12,920 La oss lage en variabel kalt foodFound at vi kan stille til 119 00:05:12,920 --> 00:05:15,530 sant når fisken går inn cheesy puffs. 120 00:05:15,530 --> 00:05:17,540 Vel, selvfølgelig, ønsker vi å sørge for at vi setter den til 121 00:05:17,540 --> 00:05:19,240 false utgangspunktet. 122 00:05:19,240 --> 00:05:22,540 Så, i fiskens tenkning tråden, vil vi sjekke for å se om 123 00:05:22,540 --> 00:05:25,400 fisken har funnet mat før visning av "jeg er sulten" 124 00:05:25,400 --> 00:05:26,770 tenkte boble. 125 00:05:26,770 --> 00:05:29,670 >> Nå kjører programmet på nytt, ser vi at fisken 126 00:05:29,670 --> 00:05:31,580 ikke blir avbrutt med tanker om sult når 127 00:05:31,580 --> 00:05:33,820 cheesy puffs er ute. 128 00:05:33,820 --> 00:05:36,820 Det siste problemet vi har er at de cheesy puffs ikke gå 129 00:05:36,820 --> 00:05:39,800 bort etter fisken, sitere unquote, "spiser" dem. 130 00:05:39,800 --> 00:05:42,305 Fra fisken skript, er det ingen enkel måte å skjule cheesy 131 00:05:42,305 --> 00:05:44,710 puffs, så vi trenger å sende en melding til cheesy puffs 132 00:05:44,710 --> 00:05:46,780 sprite å gjemme seg. 133 00:05:46,780 --> 00:05:49,550 Vi kunne gjøre dette med en annen variabel som cheesy puffs 134 00:05:49,550 --> 00:05:52,680 sprite har tilgang til, samt fisk sprite. 135 00:05:52,680 --> 00:05:55,720 >> Men det er en renere måte å gjøre dette i denne saken, 136 00:05:55,720 --> 00:05:57,840 siden i stedet for å sende en melding til et skript som er 137 00:05:57,840 --> 00:06:00,570 et sted i midten av utfører, kan vi sende 138 00:06:00,570 --> 00:06:03,710 melding til en skript som venter på å starte. 139 00:06:03,710 --> 00:06:07,360 Vi gjør dette ved å ha fisken kringkaste en hendelse, en vi vil 140 00:06:07,360 --> 00:06:08,800 ringe spist. 141 00:06:08,800 --> 00:06:11,510 Deretter vil vi lage et skript for cheesy puffs som vil 142 00:06:11,510 --> 00:06:13,030 vente på denne hendelsen. 143 00:06:13,030 --> 00:06:15,560 Dette ligner mellomromstasten tilfelle, unntatt at dette 144 00:06:15,560 --> 00:06:19,250 tid, er at brukeren ikke en direkte utløsende hendelsen. 145 00:06:19,250 --> 00:06:22,800 Nå er alt vi har å gjøre er å sette vår foodFound variabel tilbake 146 00:06:22,800 --> 00:06:25,750 til false, og vi kan nå gi sulten fisk som mange 147 00:06:25,750 --> 00:06:28,470 porsjoner med cheesy puffs som den vil. 148 00:06:28,470 --> 00:06:30,040 >> Så ikke så ille, ikke sant? 149 00:06:30,040 --> 00:06:33,400 I C, skriver multi-threaded programmer er mer komplisert, 150 00:06:33,400 --> 00:06:35,700 men det grunnleggende er de samme. 151 00:06:35,700 --> 00:06:38,690 Uansett, jeg håper du har en flott tid å bygge litt moro 152 00:06:38,690 --> 00:06:41,030 samtidige programmer i Scratch. 153 00:06:41,030 --> 00:06:42,570 Mitt navn er Nate Hardison. 154 00:06:42,570 --> 00:06:45,260 Dette er CS50.