[Powered by Google Translate] NATE Hardison: När du har flera program öppna på en
dator, det verkar som allt är
körs samtidigt.
Till exempel kanske du arbetar i en webbläsare som
Firefox eller Internet Explorer, lyssna på musik på iTunes,
och skriva en uppsats med Word.
Men under huven, de program som faktiskt
köra en åt gången.
Det är en uppgift för operativsystemet Windows, Mac OSX, eller
Linux att hantera varje av dessa separata processer, som
program är kända och växla mellan dem så att när du
gå från att kontrollera din Facebook-sida att arbeta på din uppsats
igen, är Word ett som kör.
>> Men ibland vill vi själva programmen ska kunna
att göra flera saker som detta också.
Om du är som jag, har du förmodligen en massa
olika flikar öppna i din webbläsare, en för e-post,
en med en kalender, och så vidare.
Vi kunde behandla varje flik som ett separat program eller process,
som Google Chrome gör, men många program använder
lättare vikt version av en process som kallas en tråd.
>> En tråd är bara en annan enhet för bearbetning, en uppsättning
instruktioner eller kod som kan "köra", citat citat,
samtidigt med andra trådar.
Det är det som gör det möjligt för dig att bläddra Facebook
medan du lyssnar på mig i bakgrunden eller att ha två
YouTube-videor att spela på samma gång.
Så denna allmänna fråga, som kallas samtidighet, typiskt
kommer inte upp så tidigt i datavetenskap kurser
eftersom de lägre nivå detaljer kräver diskussion om
operativsystem och liknande.
Men programmeringsspråk vi använder på
början av CS50, Scratch ger några fiffiga verktyg för att
göra det lättare att skriva program med flera saker
händer på en gång.
>> När du bygger Scratch program, du ständigt
arbetar med gängor.
Varje Scratch skript, vilket är ett kodblock som börjar med
en av de "när" pusselbitar, kan betraktas
som en separat tråd.
Låt oss titta på ett enkelt Scratch för att se hur det fungerar.
>> Här har vi en fisk objekt eller sprite, med två manus
att både start när vi klickar på den lilla gröna flaggan knappen.
Det första skriptet kontrollerar fiskens rörelse.
När den gröna flaggan klickas, blir fiskar
på vänster sida av skärmen, som kallas scenen,
vänd åt höger.
Då, i en uppsättning instruktioner som ska köra för evigt, tills vi
avbryta programmet, glider fisken till höger,
vänder, går tillbaka till den vänstra sidan, och
vänder igen.
Det andra skriptet kontrollerar fiskens tankeprocess.
Det visar sig att detta är en hungrig fisk.
Så efter att ha väntat i 3 sekunder, kommer fisken tänka,
"Jag är hungrig", för kvart sekund.
Detta skript körs också alltid.
Och som vi ser, från att köra programmet genom att klicka på
gröna flaggan, både manus verkar exekvera
samtidigt.
Fisken rör sig och tänker på samma gång.
>> Eftersom den stackars fisken ser så hungrig, låt oss lägga i några
ostliknande puffar för att äta.
Förhoppningsvis kommer de inte sönderdelas i vattnet.
När vi lägger i en andra sprite kommer vi också att kunna
Lägg i skript som motsvarar den spriten.
Och följaktligen, kommer det finnas en annan uppsättning av
trådar som springer.
Att ge användaren av vårt program kontroll över när
hungrig fisk får mat, låt oss säga att närhelst Space
Bar träffas, ostliknande puffar visas på scenen för
fisk att äta.
Innan vi slår på mellanslagstangenten, kommer vi vill behålla ostliknande
puffar gömd så att fisken inte kan se dem.
För att göra detta behöver vi ett par skript för
ostliknande puffar sprite.
Den första manus, den gröna flaggan, kommer bara dölja maten.
Till skillnad från de andra skript vi har skrivit, kommer detta ett håller inte
kör alltid.
Det kommer att börja och sluta mycket snabbt, precis när vi klickar
den gröna flaggan knappen.
>> Nästa manus vi har att vänta på mellanslagstangenten för att vara
trycks före körning.
Vi kan kalla väntar användarinmatning "väntar" eller "lyssna"
för en händelse.
Och den kod som körs när en händelse tas emot eller
hört kallas händelsehantering kod.
Vår Mellanslag händelsehanterare kommer att visa ostliknande puffar på
skärmen så att fisken kan äta dem.
Vid denna punkt, är allt ser bra ut.
>> Nästa sak vi behöver göra är att ta reda på hur man får
fisken att inse att det finns mat att äta.
Låt oss lägga till ytterligare tråd till fisken som ständigt
kontrollerar om det är vidrör den ostliknande puffar.
Vi gör detta i en separat tråd eftersom det sättet vi kan
ständigt kontrollera mat.
Annars skulle vi bara kunna regelbundet kontrollera för mat
mellan segelflyg, vända, väntar eller tänka.
>> OK.
Nu ska vi köra vårt Scratch-program.
Som väntat döljer maten omedelbart och
hungrig fisk simmar fram och tillbaka precis som förr.
När vi träffar på mellanslagstangenten, de ostliknande puffar kommer i sikte,
och hungriga fiskar säger Whoo.
Men vänta, det är konstigt.
Hur kommer fiskens "Jag är hungrig" tanke avbryter
andra saker?
Detta beror på att vi inte fastställa någon samordning
mellan de tre fiskar skript.
Varje körs i sin egen tråd, omedvetna om vad
andra gör.
Låt oss fixa detta innan vi går vidare.
>> Samordning mellan trådar är en svår uppgift eftersom vi
inte har explicit kontroll över när varje tråd löper eller
går inte.
Om du vill skicka ett meddelande från en tråd till en annan, behöver vi
att använda en variabel som vi kan ställa, eller skriva i en tråd
och läsa i den andra.
Låt oss skapa en variabel som heter foodFound som vi kan ställa till
sant när fisken rusar in i ostliknande blossen.
Jo, naturligtvis vill vi se till att vi satt det
falsk initialt.
Då, i fiskens tänkande tråd, vi kontrollera om
fisken har hittat mat innan visar "Jag är hungrig"
tankebubbla.
>> Nu kör programmet igen, ser vi att fisken
inte bli avbruten med tankar på hunger när
ostliknande puffar är ute.
Det sista problemet vi har är att de ostliknande puffar inte går
bort efter fisken, citerar unquote, "äter" dem.
Från fisken skript, det finns inget enkelt sätt att dölja ostliknande
puffar, så vi måste sända ett budskap till de ostliknande blossen
sprite att gömma sig.
Vi kan göra detta med en annan variabel att ostliknande puffar
sprite har tillgång till, samt fisk spriten.
>> Men det finns ett renare sätt att göra det i det här fallet,
eftersom istället för att skicka ett meddelande till ett manus som är
någonstans i mitten av utförande, kan vi skicka
budskap till ett skript som väntar på att starta.
Vi gör detta genom att ha fisken sända ett evenemang, en vi ska
samtal ätit.
Sedan kommer vi att skapa ett manus för de ostliknande puffar som kommer
vänta för detta evenemang.
Detta liknar mellanslagstangenten händelsen, förutom att det
tid, är användaren inte en direkt utlöser händelsen.
Nu allt vi behöver göra är att ställa vår foodFound variabel tillbaka
till false, och vi kan nu ge de hungriga fiskar så många
portioner av ostliknande puffar som det vill.
>> Så inte alltför illa, eller hur?
I C, skriver flertrådade program är mer komplicerad,
men grunderna är desamma.
Hur som helst, jag hoppas du har en fantastisk tid att bygga lite kul
parallella program i grunden.
Mitt namn är Nate Hardison.
Detta är CS50.