Tip:
Highlight text to annotate it
X
[Powered by Google Translate] NATE Hardison: Wanneer heb je meerdere programma's te openen op een
computer, het lijkt alsof alles
die op hetzelfde moment.
Bijvoorbeeld, zou u kunnen werken in een webbrowser, zoals
Firefox of Internet Explorer, luisteren naar muziek op iTunes,
en het schrijven van een essay met Word.
Echter, onder de motorkap, de programma's daadwerkelijk
lopen een voor een.
Het is de taak van het besturingssysteem, Windows, Mac OSX, of
Linux, voor elk van deze afzonderlijke processen beheren, de
programma's zijn bekend, en dus schakelen tussen hen dat wanneer u
gaan van het controleren van uw Facebook-pagina aan het werken op uw essay
weer, Word is degene die draait.
>> Soms, echter, willen we programma's zelf te kunnen
om meerdere dingen te doen zoals dit ook.
Als je net als mij, hebt u waarschijnlijk een heleboel
verschillende tabbladen te openen in uw web browser, een voor e-mail,
een met een kalender, enzovoort.
We kunnen behandelen elk tabblad als een apart programma of proces,
zoals Google Chrome doet, maar veel programma's gebruik maken van een
lichtere versie van een proces genaamd een draad.
>> Een draad is een andere eenheid van verwerking, een set
instructies of code die kan "run", citaat unquote,
gelijktijdig met andere draden.
Dit is wat maakt het voor u mogelijk om Facebook te bladeren
terwijl u luistert naar mij in de achtergrond of om twee
YouTube-video's afspelen op hetzelfde moment.
Dus, dit algemene onderwerp, bekend als concurrency, meestal
komt niet zo vroeg op in de informatica cursussen
omdat het op een lager niveau gegevens vereisen bespreking van
besturingssystemen en dergelijke.
De programmeertaal we bij de
het begin van de CS50, Scratch, biedt een aantal handige tools om
gemakkelijker kunnen programmeren met meerdere zaken
er op keer.
>> Wanneer u Scratch-programma's op te bouwen, je bent constant
werken met schroefdraad.
Elke Scratch script, een codeblok dat begint met
een van de "wanneer" puzzelstukken, kan worden gezien
als een afzonderlijke thread.
Laten we eens kijken naar een eenvoudig Scratch programma om zien hoe dit werkt.
>> Hier hebben we een vis object, of sprite, met twee scripts
dat zowel start als we op de kleine groene vlag knop.
Het eerste script controleert de vis beweging.
Wanneer de groene vlag wordt geklikt, wordt de vis geplaatst
aan de linkerzijde van het scherm genoemd stadium
naar rechts kijkt.
Dan, in een set van instructies die voor altijd zal draaien, totdat we
het programma stoppen, de vis glijdt naar rechts,
draait zich om, gaat terug naar de linkerkant, en
draait zich om opnieuw.
Het tweede script controleert de vis denkproces.
Het blijkt dat dit een hongerige vissen.
Dus na 3 seconden zal de vis denken,
"Ik heb honger," voor een vierde seconde.
Dit script draait ook altijd.
En zoals we zien, van het uitvoeren van het programma door te klikken op de
groene vlag, beide scripts lijken uit te voeren
tegelijkertijd.
De vis zich en vindt tegelijkertijd.
>> Omdat de arme vis ziet er zo hongerig, nog de toevoeging dat in sommige
cheesy pufjes voor het te eten.
Hopelijk zullen ze niet uit elkaar vallen in het water.
Wanneer we voegen in een tweede sprite, zullen we ook in staat zijn om
toe te voegen in scripts die overeenkomt met die sprite.
En derhalve zal er zijn andere set
draden die zal draaien.
Om de gebruiker van ons programma controle te geven over wanneer de
hongerige vissen krijgt voedsel, laten we zeggen dat wanneer de Space
Bar is geraakt, cheesy trekjes verschijnen op het podium voor de
vis te eten.
Voordat we raakte de spatiebalk, dan willen we de cheesy houden
trekjes verborgen, zodat de vissen ze niet kunnen zien.
Om dit te doen, zullen we een paar scripts nodig hebt voor de
cheesy puffs sprite.
Het eerste script, de groene vlag, zal alleen verbergt het voedsel.
In tegenstelling tot de andere scripts die we hebben geschreven, zal deze niet houden
draait altijd.
Het zal beginnen en eindigen heel snel, gelijk als wij op
de groene vlag knop.
>> De volgende script hebben we zullen wachten op de spatiebalk te zijn
ingedrukt voordat het uitvoeren.
We noemen wachten op invoer van de gebruiker "wachten" of "luisteren"
voor een evenement.
En de code die wordt uitgevoerd wanneer een gebeurtenis wordt ontvangen of
gehoord wordt genoemd event handling code.
Onze Spatiebalk event handler zal de cheesy trekjes op
het scherm, zodat de vis kan eten.
Op dit punt, alles ziet er goed uit.
>> Het volgende wat we moeten doen is om erachter te komen hoe je
de vis om te beseffen dat er voedsel te eten.
Laten we een andere thread toe te voegen aan de vis die voortdurend
controles al dan niet het is de cheesy trekjes aan te raken.
We doen dit in een aparte thread, omdat op die manier kunnen we
voortdurend te controleren voor voedsel.
Anders zouden we alleen in staat zijn om regelmatig te controleren voor voedsel
tussen zweefvliegen, zich om te draaien, wachten, of denken.
>> OK.
Laten we nu draaien onze Scratch-programma.
Zoals verwacht, de levensmiddelen onmiddellijk verbergt en
hongerige vissen zwemt heen en weer, net als vroeger.
Als we de spatiebalk te raken, de cheesy soesjes in beeld komen,
en de hongerige vis zegt whoo.
Maar wacht, dat is vreemd.
Hoe komt het dat de vis "Ik heb honger" gedachte onderbreekt de
andere dingen?
Dit komt omdat we niet schept geen coördinatie
tussen de drie vissen scripts.
Elke kamer is uitgevoerd in een eigen thread, zich niet bewust van wat de
anderen doen.
Laten we dit oplossen voordat we verder gaan.
>> Coördinatie tussen threads is een lastige taak omdat we
geen expliciete controle over wanneer elke draad op of
werkt niet.
Om een bericht te sturen van de ene thread naar de andere, moeten we
aan een variabele die we kunnen stellen, of schrijven te gebruiken, in een thread
en lezen in het andere.
Laten we een variabele genaamd foodFound dat we kunnen ingesteld
het geval wanneer de vis loopt in de cheesy trekjes.
Nou ja, natuurlijk, we willen ervoor zorgen dat we het op
false in eerste instantie.
Dan, in het denken van de vis draad, zullen we controleren of
de vis heeft gevonden voedsel voor het weergeven van de "Ik heb honger"
gedachte bel.
>> Nu, het uitvoeren van het programma opnieuw, zien we dat de vis
wordt niet onderbroken door gedachten van de honger wanneer de
cheesy puffs zijn uit.
Het laatste probleem dat we hebben is dat de cheesy trekjes gaan niet
weg na de vis, citeren unquote, "eet" ze.
Van de vis scripts, er is geen gemakkelijke manier om de cheesy te verbergen
soezen, dus we moeten een bericht te sturen naar de cheesy puffs
sprite om zichzelf te verbergen.
We kunnen dit doen met een andere variabele die de cheesy puffs
sprite heeft toegang tot, en de vis sprite.
>> Er is een schonere manier om dit te doen in dit geval
omdat in plaats van het verzenden van een bericht naar een script dat is
ergens in het midden van het uitvoeren, kunnen wij de
bericht naar een script dat wacht om te beginnen.
We doen dit door het hebben van de vis uit te zenden een gebeurtenis, een zullen we
bel gegeten.
Dan zullen we een script maken voor de cheesy trekjes die zal
wachten op deze gebeurtenis.
Dit is vergelijkbaar met de spatiebalk event, behalve dat deze
tijd, de gebruiker is niet degene direct de inwerkingtreding van het evenement.
Het enige wat we hoeven te doen is ingesteld onze foodFound variabele terug
op false, en we kunnen nu geven de hongerige vissen zoveel
porties cheesy trekjes zoals het wil.
>> Dus niet al te slecht, toch?
In C, schrijven multi-threaded programma is ingewikkelder,
maar de basis hetzelfde.
Hoe dan ook, ik hoop dat je een geweldige tijd bouwen wat plezier
gelijktijdige programma's in Scratch.
Mijn naam is Nate Hardison.
Dit is CS50.