Tip:
Highlight text to annotate it
X
[Powered by Google Translate] NATE Hardison: Quando hai aperto più programmi su un
computer, sembra che sia tutto a
esecuzione contemporaneamente.
Ad esempio, si supponga di lavorare in un browser web come
Firefox o Internet Explorer, l'ascolto di musica su iTunes,
e la scrittura di un saggio con Word.
Tuttavia, sotto il cofano, i programmi effettivamente
eseguire uno alla volta.
E 'il lavoro del sistema operativo, Windows, Mac OSX, o
Linux, per gestire ciascuno di questi processi separati, come
programmi sono noti, e passare da una all'altra in modo che quando si
passare da controllare la vostra pagina di Facebook a lavorare sul tuo saggio
ancora una volta, Word è quella che è in esecuzione.
>> A volte, però, vogliamo che i programmi stessi per essere in grado
di fare più cose come questa, anche.
Se siete come me, probabilmente avete un sacco di
diverse schede si aprirà nel browser web, uno per la posta elettronica,
uno con un calendario, e così via.
Si potrebbe trattare ogni scheda come un programma separato o un processo,
come Google Chrome fa, ma molti programmi utilizzare un
più leggera versione di un processo chiamato un thread.
>> Un filo è solo un'altra unità di elaborazione, un insieme di
istruzioni o di codice in grado di "funzionare", fine citazione citazione,
in concomitanza con altri thread.
Questo è ciò che rende possibile per voi di sfogliare Facebook
durante l'ascolto di me in background o di avere due
I video di YouTube giocare allo stesso tempo.
Quindi, questo argomento generale, noto come concorrenza, tipicamente
non venire così presto in corsi di informatica
perché i dettagli di basso livello richiede la discussione di
sistemi operativi e simili.
Tuttavia, il linguaggio di programmazione che usiamo al
all'inizio del CS50, Scratch, fornisce alcuni strumenti nifty per
rendere più facile la scrittura di programmi con le cose più
in corso in una sola volta.
>> Quando si genera programmi Scratch, sei costantemente
lavorando con fili.
Ogni script Scratch, che è un blocco di codice che inizia con
uno dei "quando" i pezzi del puzzle, può essere pensato
come un thread separato.
Diamo un'occhiata a un programma Scratch semplice per vedere come funziona.
>> Qui, abbiamo un oggetto di pesce, o sprite, con due script
che sia la partenza, quando si clicca sul pulsante piccola bandiera verde.
Il primo script controlla il movimento del pesce.
Quando la bandiera verde si fa clic, il pesce viene collocato
sul lato sinistro dello schermo, chiamato stadio,
rivolto a destra.
Poi, in un insieme di istruzioni che ti corrono sempre, fino a quando non
arrestare il programma, il pesce scivola verso il lato destro,
si volta, torna a sinistra, e
si gira di nuovo.
Il secondo script controlla processo di pensiero del pesce.
Si scopre che si tratta di un pesce affamato.
Quindi, dopo aver atteso per 3 secondi, il pesce penserà,
"Ho fame," per un secondo quarto.
Questo script funziona anche per sempre.
E come si vede, di lanciare il programma facendo clic sul
bandiera verde, appaiono entrambi gli script da eseguire
contemporaneamente.
Il pesce si muove e pensa allo stesso tempo.
>> Dal momento che il povero pesce sembra così affamato, aggiungiamo in qualche
soffi di formaggio a mangiare.
Speriamo che non si disintegrerà in acqua.
Quando si aggiunge in una sprite secondo, saremo anche in grado di
aggiungere negli script corrispondenti a tale sprite.
E, quindi, ci sarà un altro gruppo di
thread che ti corrono.
Per dare all'utente del nostro programma di controllo su quando il
pesce affamato riceve il cibo, diciamo che ogni volta che lo spazio
Bar è colpito, sbuffi formaggio appaiono sul palco per la
pesce da mangiare.
Prima di premere la barra spaziatrice, dobbiamo provare a mantenere il formaggio
sbuffi nascosto in modo che il pesce non può vederli.
Per fare questo, avremo bisogno di un paio di script per il
sbuffi formaggio sprite.
Il primo script, la bandiera verde, sarà solo nascondere il cibo.
A differenza degli altri script che abbiamo scritto, questo non mancherà di tenere
esecuzione per sempre.
Si iniziano e finiscono molto velocemente, proprio quando si clicca
il pulsante di bandiera verde.
>> Lo script successivo che abbiamo aspetterà la barra spaziatrice per essere
premuto prima di eseguire.
Possiamo chiamare in attesa di input da parte dell'utente "in attesa" o "ascolto"
per un evento.
E il codice che viene eseguito quando un evento viene ricevuto o
sentito si chiama codice per la gestione degli eventi.
Il nostro Bar gestore di spazi per eventi, mostrerà gli sbuffi di formaggio
lo schermo in modo che il pesce possa mangiare.
A questo punto, tutto ciò che ha un buon aspetto.
>> La prossima cosa che dobbiamo fare è quello di capire come ottenere
il pesce per rendersi conto che non c'è cibo da mangiare.
Proviamo ad aggiungere un altro thread per il pesce che costantemente
verifica se sia o non è che toccano gli sbuffi di formaggio.
Lo facciamo in un thread separato in quanto in questo modo possiamo
costantemente verificare la presenza di cibo.
In caso contrario, avremmo solo essere in grado di controllare periodicamente per il cibo
tra volo a vela, girando intorno, in attesa, o di pensare.
>> OK.
Ora eseguire il nostro programma Scratch.
Come previsto, il cibo immediatamente e nasconde l'
pesci affamati nuota avanti e indietro proprio come prima.
Quando abbiamo raggiunto la barra spaziatrice, i bignè di formaggio entrerà in vista,
e il pesce affamato dice whoo.
Ma aspetta, questo è strano.
Come mai il pesce "Ho fame" interrompe il pensiero
altre cose?
Questo perché non ha stabilito un coordinamento
tra i tre script di pesce.
Ognuno è in esecuzione in un thread separato, ignaro di ciò che il
altri stanno facendo.
Si può correggere prima di andare avanti.
>> Il coordinamento tra i thread è un compito difficile dal momento che
non hanno controllo esplicito su quando ogni thread viene eseguito o
non funziona.
Per inviare un messaggio da un thread ad un altro, avremo bisogno
di utilizzare una variabile che possiamo impostare, o scrivere, in un thread
e leggere l'altra.
Creiamo un foodFound variabile chiamata che possiamo impostare per
vero quando il pesce incontra gli sbuffi di formaggio.
Beh, certo, vogliamo fare in modo che abbiamo impostato
inizialmente su false.
Poi, nel filo di pensiero del pesce, dovremo verificare se
il pesce ha trovato il cibo prima di visualizzare l '"ho fame"
pensiero bolla.
>> Ora, eseguire nuovamente il programma, vediamo che i pesci
non si interruppe con pensieri di fame quando il
sbuffi di formaggio sono fuori.
L'ultimo problema che abbiamo è che i bignè di formaggio non vanno
via dopo il pesce, citare unquote, "mangia" di loro.
Da gli script di pesce, non c'è un modo semplice per nascondere il formaggio
sbuffi, quindi abbiamo bisogno di mandare un messaggio agli sbuffi di formaggio
sprite di nascondersi.
Potremmo farlo con un'altra variabile che gli sbuffi di formaggio
sprite ha accesso a, così come la sprite pesce.
>> Tuttavia, c'è un modo più pulito per fare questo, in questo caso,
poiché invece di inviare un messaggio a uno script che è
qualche parte nel mezzo di esecuzione, è possibile inviare il
messaggio a uno script che è in attesa di iniziare.
Lo facciamo avendo il pesce trasmettere un avvenimento, uno faremo
chiamare mangiato.
Poi, creeremo uno script per i bignè di formaggio che la volontà
attesa per questo evento.
Questo è simile all'evento Space Bar, tranne che questo
tempo, l'utente non è quella direttamente attivando l'evento.
Ora tutto quello che dobbiamo fare è impostare la nostra schiena variabile foodFound
su false, e ora possiamo dare il pesce affamato come molti
porzioni di sbuffi di formaggio come vuole.
>> Quindi, non troppo male, vero?
In C, scrivere programmi multi-threaded è più complicato,
ma le basi sono le stesse.
In ogni caso, spero che tu abbia un grande momento di costruire un po 'di divertimento
programmi concorrenti in Scratch.
Il mio nome è Nate Hardison.
Questo è CS50.