Tip:
Highlight text to annotate it
X
[Powered by Google Translate] NATE Hardison: Når du har fået flere programmer åbne på en
computer, det ser ud som alt er
kører samtidig.
For eksempel kan du arbejde i en web browser som
Firefox eller Internet Explorer, lytte til musik på iTunes,
og skrive et essay med Word.
Men under kølerhjelmen, faktisk programmerne
køre en ad gangen.
Det er en opgave for operativsystemet, Windows, Mac OSX, eller
Linux, til at styre hver af disse separate processer, som
programmer er kendt, og skifte mellem dem, så når du
gå fra at tjekke din Facebook-side til at arbejde på din essay
igen, Word er den, der kører.
>> Nogle gange ønsker vi dog programmer selv at kunne
at gøre flere ting som dette, også.
Hvis du ligesom mig, har du sandsynligvis har en masse
forskellige faner åbne i din web browser, en for e-mail,
én med en kalender, og så videre.
Vi kunne behandle hver fane som et separat program eller en proces,
ligesom Google Chrome gør, men mange programmer bruger en
lettere vægt version af en proces, der kaldes en tråd.
>> En tråd er bare en anden enhed af behandlingen, et sæt
instruktioner eller kode, der kan "køre", citerer citat ***,
samtidig med andre tråde.
Dette er, hvad der gør det muligt for dig at browse Facebook
mens du lytter til mig i baggrunden eller til at have to
YouTube-videoer spiller på samme tid.
Så dette generelle emne, kendt som concurrency, typisk
kommer ikke op så tidligt i datalogikurser
fordi de lavere niveau detaljer kræver diskussion af
operativsystemer og lignende.
Men programmeringssproget vi bruger på det
begyndelsen af CS50, Scratch, giver nogle smarte værktøjer til at
gøre det lettere at skrive programmer med flere ting
foregår på én gang.
>> Når du bygger Skrab programmer, du er konstant
arbejder med gevind.
Hver Scratch script, som er en kodeblok, der begynder med
en af de "når" puslespilsbrikker, kan opfattes
som en separat tråd.
Lad os se på et simpelt Skrab program for at se, hvordan det virker.
>> Her har vi en fisk objekt, eller Sprite, med to scripts
at både start, når vi klikker på det lille grønne flag knap.
Det første script styrer fiskens bevægelse.
Når den grønne flag er klikket, bliver fisken placeret
på venstre side af skærmen, kaldet fase,
mod højre.
Så i et sæt af instruktioner, der vil køre for evigt, indtil vi
stoppe programmet, fisken glider til den højre side,
vender sig om, går tilbage til den venstre side, og
vender rundt igen.
Det andet script styrer fiskens tankeproces.
Det viser sig, at dette er en sulten fisk.
Så efter at have ventet i 3 sekunder, vil fiskene tænke,
"Jeg er sulten," for en fjerde sekund.
Dette script kører også for evigt.
Og som vi ser, fra at køre programmet ved at klikke på
grøn flag, begge scripts synes at udføre
samtidigt.
Fisken bevæger sig og tænker på samme tid.
>> Da den stakkels fisk ser så sulten, lad os tilføje i nogle
osteagtig drag for det at spise.
Forhåbentlig vil de ikke opløses i vandet.
Når vi tilføjer i en anden sprite, vil vi også være i stand til
tilføje i scripts, der svarer til det sprite.
Og dermed vil der være et andet sæt
tråde, der vil køre.
At give brugeren af vores program kontrol over, hvornår den
sultne fisk får mad, lad os sige, at når Space
Bar er ramt, osteagtig pust vises på scenen for
fisk at spise.
Før vi ramt Space Bar, vil vi ønsker at holde teatralsk
pust skjult, således at fiskene ikke kan se dem.
For at gøre dette, vil vi bruge et par scripts til
teatralsk pust Sprite.
Det første script, den grønne flag, vil bare skjule fødevarer.
I modsætning til de andre scripts, vi har skrevet, vil denne ene ikke holde
kører altid.
Det vil starte og slutte meget hurtigt, lige når vi klikker
det grønne flag knap.
>> Det næste script vi har, vil vente på Space Bar at være
presset før du udfører.
Vi kan kalde venter på input fra brugeren "venter" eller "lytter"
for en begivenhed.
Og den kode, der henretter, når en hændelse er modtaget eller
hørt kaldes begivenhed håndtering kode.
Vores Space Bar hændelseshandler vil vise de teatralsk pust på
skærmen, så fiskene kan spise dem.
På dette tidspunkt er alt ser godt ud.
>> Den næste ting, vi skal gøre, er at finde ud af, hvordan du får
fiskene at indse, at der er mad at spise.
Lad os tilføje en anden tråd til fisk, der konstant
checks eller ej, det rører osteagtig sug.
Vi gør dette i en separat tråd, da vi på den måde kan
konstant tjekke for fødevarer.
Ellers ville vi kun kunne regelmæssigt kontrollere for fødevarer
i mellem svæveflyvning, dreje rundt, venter, eller tænker.
>> OK.
Nu lad os køre vores Scratch program.
Som forventet, fødevarer straks skjuler og
sultne fisk svømmer frem og tilbage ligesom før.
Da vi ramte Space Bar, osteagtig puffs komme til syne,
og de sultne fisk, siger Whoo.
Men vent, det er underligt.
Hvordan kommer fiskens "Jeg er sulten," tænkte afbryder
andre ting?
Dette skyldes, at vi ikke etablere nogen koordination
mellem de tre fisk scripts.
Hver kører i sin egen tråd, uvidende om hvad det
andre gør.
Lad os løse dette, før vi går videre.
>> Koordinering mellem tråde er en vanskelig opgave, da vi
ikke har eksplicit kontrol over, hvornår hver tråd løber eller
kører ikke.
Du kan sende en besked fra en tråd til en anden, får vi brug
at bruge en variabel, som vi kan indstille, eller skrive i en tråd
og læse i den anden.
Lad os oprette en variabel kaldet foodFound, at vi kan indstilles til
tilfældet, når fisken løber ind i osteagtig sug.
Nå, selvfølgelig, ønsker vi at sikre, at vi indstiller den til
false indledningsvis.
Så i fiskens tænkning tråd, vil vi kontrollere, om
fisken har fundet mad før visning af "Jeg er sulten"
tænkte boble.
>> Nu kører programmet igen, ser vi, at fiskene
ikke bliver afbrudt med tanker om sult, når
teatralsk pust er ude.
Det sidste problem, vi har, er, at de teatralsk pust ikke går
væk efter fisk, citat *** citere, "æder" dem.
Fra fisk scripts, er der ingen nem måde at skjule teatralsk
pust, så vi er nødt til at sende et budskab til de teatralsk sug
sprite at skjule sig.
Vi kunne gøre dette med en anden variabel, at de teatralsk sug
sprite har adgang til, samt fisken sprite.
>> Men der er en renere måde at gøre dette i denne sag,
eftersom stedet for at sende en besked til et script, der er
et eller andet sted i midten af fuldbyrdelsesstaten, kan vi sende den
besked til et script, der venter på at starte.
Vi gør dette ved at have fiskene transmittere en begivenhed, et vi får
ringe spist.
Derefter vil vi lave et script for de teatralsk sug, der vil
vente på denne begivenhed.
Dette svarer til Space Bar begivenhed, bortset fra at denne
tid, at brugeren er ikke en direkte udløser tilfælde.
Nu er alt vi skal gøre er sat vores foodFound variabel tilbage
til falsk, og vi kan nu give de sultne fisk som mange
portioner af teatralsk pust som den ønsker.
>> Så ikke alt for dårlig, right?
I C, er at skrive flertrådede programmer mere kompliceret,
men det grundlæggende er de samme.
Anyway, jeg håber du har en stor tid på at bygge nogle sjove
samtidige programmer i Scratch.
Mit navn er Nate Hardison.
Det er CS50.