[Powered by Google Translate] NATE HARDISON: Όταν έχεις πολλά προγράμματα που είναι ανοικτά σε ένα
υπολογιστή, φαίνεται ότι όλα είναι
κινούνται με την ίδια φορά.
Για παράδειγμα, μπορεί να εργάζεστε σε ένα πρόγραμμα περιήγησης στο Web, όπως
Firefox ή ο Internet Explorer, να ακούτε μουσική στο iTunes,
και γράφοντας ένα δοκίμιο με το Word.
Ωστόσο, κάτω από την κουκούλα, τα προγράμματα στην πραγματικότητα
τρέχει ένα κάθε φορά.
Είναι η δουλειά του λειτουργικού συστήματος, Windows, Mac OSX, ή
Linux, για να διαχειριστεί κάθε μία από αυτές τις χωριστές διαδικασίες, όπως η
προγράμματα είναι γνωστά, και εναλλαγή μεταξύ τους, έτσι ώστε όταν
πάει από τον έλεγχο σελίδα σας στο Facebook να εργάζεται για το δοκίμιό σας
και πάλι, το Word είναι αυτός που τρέχει.
>> Μερικές φορές, όμως, θέλουμε τα προγράμματα οι ίδιοι να είναι σε θέση
να κάνει πολλά πράγματα, όπως αυτό, πάρα πολύ.
Αν είστε σαν κι εμένα, έχετε πιθανώς ένα μάτσο
διαφορετικές καρτέλες ανοίξει στο web browser σας, μία για το ηλεκτρονικό ταχυδρομείο,
ένα με ένα ημερολόγιο, και ούτω καθεξής.
Θα μπορούσαμε να τη θεραπεία κάθε καρτέλα ως ένα ξεχωριστό πρόγραμμα ή διαδικασία,
όπως το Google Chrome κάνει, αλλά πολλά προγράμματα χρησιμοποιούν μια
ελαφρύτερη έκδοση μιας διαδικασίας που ονομάζεται το νήμα.
>> Ένα νήμα είναι ακριβώς μια άλλη μονάδα επεξεργασίας, ένα σύνολο
οδηγίες ή κώδικα που μπορεί να "τρέξει", unquote απόσπασμα,
ταυτόχρονα με άλλα θέματα.
Αυτό είναι αυτό που καθιστά δυνατή για να μπορείτε να περιηγηθείτε στο Facebook
ενώ ακούει στο παρασκήνιο ή να έχουν δύο
YouTube βίντεο παίζουν ταυτόχρονα.
Έτσι, αυτό το γενικό θέμα, που είναι γνωστή ως ταυτοχρονισμού, συνήθως
δεν έρχονται τόσο νωρίς στα μαθήματα επιστήμης των υπολογιστών
επειδή οι χαμηλού επιπέδου λεπτομέρειες απαιτούν συζήτηση
λειτουργικά συστήματα και τα παρόμοια.
Ωστόσο, η γλώσσα προγραμματισμού που χρησιμοποιούμε κατά τη
αρχίζοντας από CS50, Ξυστό, παρέχει κάποια εργαλεία ικανό να
καθιστούν πιο εύκολο να γράψει προγράμματα με πολλαπλές πράγματα
συμβαίνει με τη μία.
>> Όταν δημιουργείτε προγράμματα Scratch, είστε συνεχώς
σε συνεργασία με τα θέματα.
Κάθε σενάριο Ξυστό, το οποίο είναι ένα κομμάτι κώδικα που ξεκινά με
ένα από τα κομμάτια "όταν το" παζλ, μπορεί να θεωρηθεί
ως ένα ξεχωριστό νήμα.
Ας δούμε ένα απλό πρόγραμμα Scratch για να δούμε πώς αυτό λειτουργεί.
>> Εδώ, έχουμε ένα αντικείμενο ψάρι, ή Sprite, με δύο σενάρια
ότι τόσο ξεκίνημα όταν πατάμε το μικρό πράσινο κουμπί σημαία.
Το πρώτο σενάριο ελέγχει την κίνηση των ψαριών.
Όταν η πράσινη σημαία γίνει κλικ, το ψάρι παίρνει θέση
στην αριστερή πλευρά της οθόνης, που ονομάζεται το στάδιο,
στραμμένη προς τα δεξιά.
Στη συνέχεια, σε ένα σύνολο οδηγιών που θα τρέχει για πάντα, μέχρι να
να σταματήσει το πρόγραμμα, το ψάρι γλιστρά προς τη δεξιά πλευρά,
γυρίζει γύρω, πηγαίνει πίσω στην αριστερή πλευρά, και
γυρίζει και πάλι.
Το δεύτερο σενάριο ελέγχει την διαδικασία της σκέψης των ψαριών.
Αποδεικνύεται ότι αυτό είναι ένα πεινασμένο ψάρι.
Έτσι, μετά από αναμονή για 3 δευτερόλεπτα, τα ψάρια θα σκεφτούν,
"Είμαι πεινασμένος," για ένα τέταρτο του δευτερολέπτου.
Αυτό το script τρέχει επίσης για πάντα.
Και όπως βλέπουμε, από την εκτέλεση του προγράμματος, κάνοντας κλικ στο
πράσινη σημαία, τα δύο σενάρια φαίνεται να εκτελέσει
ταυτόχρονα.
Το ψάρι κινείται και σκέφτεται την ίδια στιγμή.
>> Δεδομένου ότι η κακή ψάρι φαίνεται τόσο πεινασμένοι, ας προσθέσουμε σε ορισμένες
τυρώδης εισπνοές για να φάει.
Ελπίζουμε ότι δεν θα διασπώνται στο νερό.
Όταν έχουμε προσθέσει σε ένα δεύτερο sprite, θα είναι επίσης σε θέση να
προσθέσετε σε σενάρια που αντιστοιχούν σε αυτό το ξωτικό.
Και, ως εκ τούτου, θα υπάρξει ένα άλλο σύνολο
τα θέματα που θα τρέξει.
Για να δώσει στο χρήστη τον έλεγχο του προγράμματος μας για το πότε η
πεινασμένο ψάρι παίρνει τροφή, ας πούμε ότι κάθε φορά που η Space
Μπαρ χτυπιέται, τυρώδης ρουφηξιές εμφανιστεί στη σκηνή για το
ψάρια για να φάνε.
Πριν χτυπήσει το Space Bar, θα θέλετε να κρατήσετε την τυρώδης
εισπνοές κρυμμένα έτσι ώστε τα ψάρια δεν μπορούν να τα δουν.
Για να το κάνετε αυτό, θα χρειαστείτε ένα ζευγάρι των σεναρίων για την
τυρώδης ρουφηξιές sprite.
Το πρώτο σενάριο, η πράσινη σημαία, θα κρύψει μόνο το φαγητό.
Σε αντίθεση με τα άλλα σενάρια που έχω γράψει, αυτό δεν θα κρατήσει
τρέχει για πάντα.
Θα ξεκινήσει και να τελειώσει πολύ γρήγορα, δεξιά όταν κάνουμε κλικ
το πράσινο κουμπί σημαία.
>> Το επόμενο σενάριο που έχουμε θα περιμένουμε για το Space Bar για να
πατηθεί πριν την εκτέλεση.
Μπορούμε να αναμονή για την είσοδο χρήστη "αναμονή" ή "ακούει"
για μια εκδήλωση.
Και ο κώδικας που εκτελείται όταν ένα συμβάν έχει λάβει ή
ακούσει ονομάζεται συμβάν κώδικα χειρισμού.
Space handler μας εκδήλωση Bar θα δείτε τα τυρώδης εισπνοών για
η οθόνη έτσι ώστε τα ψάρια να τα φάνε.
Σε αυτό το σημείο, τα πάντα είναι καλές.
>> Το επόμενο πράγμα που πρέπει να κάνουμε είναι να καταλάβω πώς να το πάρει
το ψάρι να συνειδητοποιήσουμε ότι δεν υπάρχει φαγητό να φάνε.
Ας προσθέσω άλλο νήμα για τα ψάρια που συνεχώς
ελέγχει εάν ή όχι αυτό είναι το άγγιγμα των τυρώδης ρουφηξιές.
Το κάνουμε αυτό σε ένα ξεχωριστό νήμα από αυτόν τον τρόπο μπορούμε να
συνεχώς έλεγχος για τα τρόφιμα.
Διαφορετικά, θα είναι σε θέση να ελέγχει περιοδικά για τα τρόφιμα
μεταξύ πλαγιάς, στροφή γύρω, περιμένοντας, ή σκέψης.
>> OK.
Τώρα, ας τρέξει το πρόγραμμα Scratch μας.
Όπως ήταν αναμενόμενο, η τροφή αμέσως κρύβει και η
πεινασμένο ψάρι κολυμπά εμπρός και πίσω ακριβώς όπως πριν.
Όταν χτυπήσει το Space Bar, οι ριπές τυρώδης έρχονται σε θέα,
και το πεινασμένο ψάρι λέει whoo.
Αλλά περιμένετε, αυτό είναι παράξενο.
Πώς έρχονται τα ψάρια του "Είμαι πεινασμένος" διακόπτει την σκέψη
άλλα πράγματα;
Αυτό οφείλεται στο γεγονός ότι δεν θεμελιώνει κανένα συντονισμό
μεταξύ των τριών σεναρίων ψάρια.
Κάθε τρέχει το δικό της νήμα, να αγνοεί ό, τι το
κάνουν οι άλλοι.
Ας το διορθώσω αυτό πριν προχωρήσουμε.
>> Ο συντονισμός μεταξύ των θεμάτων είναι ένα δύσκολο έργο, δεδομένου ότι
δεν έχουν σαφή έλεγχο όταν τρέχει κάθε νήμα ή
δεν λειτουργεί.
Για να στείλετε ένα μήνυμα από το ένα νήμα στο άλλο, θα πρέπει να
να χρησιμοποιήσετε μια μεταβλητή που μπορούμε να θέσουμε, ή να γράψει, σε ένα νήμα
και διαβάστε στο άλλο.
Ας δημιουργήσουμε μια μεταβλητή που ονομάζεται foodFound ότι μπορούμε να θέσουμε σε
ισχύει όταν τα ψάρια τρέχει στα τυρώδης ρουφηξιές.
Λοιπόν, φυσικά, θέλουμε να είμαστε σίγουροι ότι αυτό που να
false αρχικά.
Στη συνέχεια, το νήμα σκέψης των ψαριών, θα ελέγξετε για να δείτε αν
το ψάρι έχει βρει φαγητό πριν από την εμφάνιση του "Είμαι πεινασμένος"
σκέψης φούσκα.
>> Τώρα, τρέχει το πρόγραμμα και πάλι, βλέπουμε ότι τα ψάρια
δεν παίρνει διακοπεί με τις σκέψεις της πείνας, όταν η
τυρώδης ρουφηξιές είναι έξω.
Το τελευταίο πρόβλημα που έχουμε είναι ότι οι τυρώδης εισπνοές δεν πηγαίνουν
μακριά από το ψάρι, παραθέτω unquote, "τρώει" τους.
Από τα σενάρια ψάρια, δεν υπάρχει εύκολος τρόπος για να κρύψει το τυρώδης
εισπνοών, γι 'αυτό πρέπει να στείλετε ένα μήνυμα στους τυρώδης ρουφηξιές
sprite να κρυφτεί.
Θα μπορούσαμε να το κάνουμε αυτό με μια άλλη μεταβλητή ότι οι τυρώδης ρουφηξιές
sprite έχει πρόσβαση σε, καθώς και το sprite ψαριών.
>> Ωστόσο, υπάρχει ένα καθαρότερο τρόπο για να το κάνουμε αυτό σε αυτή την περίπτωση,
αφού αντί για την αποστολή ενός μηνύματος σε ένα σενάριο που είναι
κάπου στη μέση της εκτέλεσης, μπορούμε να στείλουμε το
μήνυμα σε ένα σενάριο που περιμένει να ξεκινήσει.
Το κάνουμε αυτό με το να τα ψάρια ραδιοτηλεοπτικής μετάδοσης μιας εκδήλωσης, αυτή που θα
καλέστε φάει.
Στη συνέχεια, θα δημιουργήσετε μια δέσμη ενεργειών για τις τυρώδης ρουφηξιές που θα
περιμένετε για αυτό το γεγονός.
Αυτό είναι παρόμοιο με την εκδήλωση Bar Διαστήματος, εκτός του ότι αυτό
χρόνο, ο χρήστης δεν είναι ένα άμεσα η ενεργοποίηση της εκδήλωσης.
Τώρα το μόνο που έχουμε να κάνουμε είναι να οριστεί foodFound πίσω μεταβλητή μας
σε false, και μπορούμε να δώσουμε τώρα τον πεινασμένο ψάρι, όπως πολλοί
μερίδες τυρώδης ρουφηξιές όπως θέλει.
>> Έτσι, δεν είναι και τόσο άσχημα, έτσι δεν είναι;
Στην C, γράφοντας multi-threaded προγράμματα είναι πιο περίπλοκη,
αλλά τα βασικά είναι η ίδια.
Τέλος πάντων, ελπίζω ότι έχετε μια μεγάλη στιγμή για την οικοδόμηση κάποια διασκέδαση
ταυτόχρονη προγράμματα Scratch.
Το όνομά μου είναι Nate Hardison.
Αυτό είναι CS50.