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