[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.