[Powered by Google Translate] NATE Hardison: Når du har flere programmer åpne på en datamaskin, virker det som alt er kjører på samme tid. For eksempel kan du jobbe i en nettleser som Firefox eller Internet Explorer, lytte til musikk på iTunes, og skrive et essay med Word. Men under panseret, programmene faktisk kjøre en om gangen. Det er jobben av operativsystemet, Windows, Mac OSX, eller Linux, å administrere hver av disse separate prosesser, som programmer er kjent, og veksle mellom dem, slik at når du gå fra å sjekke din Facebook-side til å jobbe på essayet ditt igjen, er Word den som kjører. Noen ganger, skjønt, vil vi programmer selv å være i stand å gjøre flere ting som dette, også. Hvis du er som meg, har du sannsynligvis en haug med forskjellige faner åpne i nettleseren din, en for e-post, en med en kalender, og så videre. Vi kunne behandle hver kategori som et eget program eller prosess, som Google Chrome gjør, men mange programmer bruker en lettere vekt versjon av en prosess kalt en tråd. En tråd er bare en annen enhet av behandling, et sett av instruksjoner eller koder som kan "kjøre", sitat unquote, samtidig med andre tråder. Dette er det som gjør det mulig for deg å bla Facebook mens du lytter til meg i bakgrunnen eller å ha to YouTube-videoer å spille på samme tid. Så, denne generelle tema, kjent som samtidighet, typisk kommer ikke opp så tidlig i informatikk kurs fordi lavere nivå detaljer krever drøfting av operativsystemer og lignende. Men programmeringsspråket vi bruker på begynnelsen av CS50, Scratch, gir noen smarte verktøy for å gjøre det enklere å skrive programmer med flere ting skjer på en gang. Når du bygger Scratch programmer, er du hele tiden arbeider med tråder. Hver Scratch script, som er en kode blokk som begynner med en av de "når" puslespillbiter, kan tenkte på som en separat tråd. La oss se på et enkelt Scratch program for å se hvordan dette fungerer. Her har vi en fisk objekt, eller sprite, med to skript at både start når vi klikker den lille grønne flagg-knappen. Det første manuset styrer fiskens bevegelse. Når den grønne flagget er klikket, blir fisken plassert på venstre side av skjermen, kalt scenen, mot høyre. Så, i et sett med instruksjoner som skal kjøre evig, før vi stoppe programmet, glir fisken til høyre side, snur seg, går tilbake til venstre side, og snur seg igjen. Det andre skriptet kontrollerer fiskens tankeprosess. Det viser seg at dette er en sulten fisk. Så etter å ha ventet i 3 sekunder, vil fisken tenke, "Jeg er sulten," for en fjerde sekund. Dette skriptet kjører også alltid. Og som vi ser, fra å kjøre programmet ved å klikke på grønt flagg, både skript synes å utføre samtidig. Fisken beveger og tenker samtidig. Siden dårlig fisk ser så sulten, la oss legge inn noen cheesy puffs for det å spise. Forhåpentligvis de ikke vil gå i oppløsning i vannet. Når vi legger til i en annen sprite, vil vi også kunne legge i skript som samsvarer med den sprite. Og dermed vil det være et annet sett med tråder som vil kjøre. Å gi brukeren av vårt program kontroll over når sulten fisk får mat, la oss si at når Space Bar er truffet, cheesy puffs vises på scenen for fisk å spise. Før vi treffer Space Bar, vil vi ønsker å beholde den cheesy puffs skjult slik at fisken ikke kan se dem. For å gjøre dette, trenger vi et par av skript for cheesy puffs sprite. Det første skriptet, den grønne flagg, vil bare gjemme maten. I motsetning til de andre skriptene vi har skrevet, vil dette ikke holde kjører alltid. Det vil starte og avslutte veldig raskt, akkurat når vi klikker grønt flagg-knappen. Den neste script vi har vil vente på Space Bar å være trykket før du utfører. Vi kan kalle venter på brukerens input "venter" eller "lytte" for en hendelse. Og koden som utføres når en hendelse blir mottatt eller hørt kalles event håndtering kode. Vår Space Bar hendelseshåndterer vil vise cheesy puffs på skjermen slik at fisken kan spise dem. På dette punktet, er alt ser bra ut. Det neste vi må gjøre er å finne ut hvordan du får fisken til å innse at det er mat å spise. La oss legge til en annen tråd til fisken som stadig sjekker om det er rørende cheesy puffs. Vi gjør dette i en egen tråd siden den måten vi kan hele tiden se etter mat. Ellers ville vi bare kunne jevnlig se etter mat i mellom gliding, snu, venter eller tenker. OK. Nå la oss kjøre vår Scratch program. Som forventet, maten umiddelbart skjuler og sulten fisk svømmer frem og tilbake akkurat som før. Når vi treffer Space Bar, cheesy puffs kommer til syne, og sulten fisk sier Whoo. Men vent, det er rart. Hvordan kommer fiskens "Jeg er sulten" tenkte avbryter andre ting? Dette er fordi vi ikke etablere noen samordning mellom de tre fisk skript. Hver kjører i sin egen tråd, uvitende om hva andre gjør. La oss fikse dette før vi går videre. Samordning mellom tråder er en vanskelig oppgave, siden vi har ikke eksplisitt kontroll over når hver tråd løper eller går ikke. Slik sender du en melding fra en tråd til en annen, må vi å bruke en variabel som vi kan sette, eller skrive, i en tråd og lese i den andre. La oss lage en variabel kalt foodFound at vi kan stille til sant når fisken går inn cheesy puffs. Vel, selvfølgelig, ønsker vi å sørge for at vi setter den til false utgangspunktet. Så, i fiskens tenkning tråden, vil vi sjekke for å se om fisken har funnet mat før visning av "jeg er sulten" tenkte boble. Nå kjører programmet på nytt, ser vi at fisken ikke blir avbrutt med tanker om sult når cheesy puffs er ute. Det siste problemet vi har er at de cheesy puffs ikke gå bort etter fisken, sitere unquote, "spiser" dem. Fra fisken skript, er det ingen enkel måte å skjule cheesy puffs, så vi trenger å sende en melding til cheesy puffs sprite å gjemme seg. Vi kunne gjøre dette med en annen variabel som cheesy puffs sprite har tilgang til, samt fisk sprite. Men det er en renere måte å gjøre dette i denne saken, siden i stedet for å sende en melding til et skript som er et sted i midten av utfører, kan vi sende melding til en skript som venter på å starte. Vi gjør dette ved å ha fisken kringkaste en hendelse, en vi vil ringe spist. Deretter vil vi lage et skript for cheesy puffs som vil vente på denne hendelsen. Dette ligner mellomromstasten tilfelle, unntatt at dette tid, er at brukeren ikke en direkte utløsende hendelsen. Nå er alt vi har å gjøre er å sette vår foodFound variabel tilbake til false, og vi kan nå gi sulten fisk som mange porsjoner med cheesy puffs som den vil. Så ikke så ille, ikke sant? I C, skriver multi-threaded programmer er mer komplisert, men det grunnleggende er de samme. Uansett, jeg håper du har en flott tid å bygge litt moro samtidige programmer i Scratch. Mitt navn er Nate Hardison. Dette er CS50.