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