Νήματα#
Εισαγωγή#
Τα νήματα επιτρέπουν σε ένα ρομπότ να εκτελεί πολλαπλές εργασίες ταυτόχρονα μέσα στο ίδιο πρόγραμμα. Επιτρέπουν την εκτέλεση πολλαπλών εργασιών, επιτρέποντας στο ρομπότ να εκτελεί ανεξάρτητες ενέργειες ταυτόχρονα.
Κατασκευαστές κλάσεων#
1 — Δημιουργεί και ξεκινά ένα νέο νήμα με μια συνάρτηση.
thread( void (* callback)(void) );
2 — Δημιουργεί και ξεκινά ένα νέο νήμα με μια συνάρτηση που δέχεται ένα όρισμα.
thread( int (* callback)(void *), void *arg );
Καταστροφέας κλάσης#
Καταστρέφει το αντικείμενο thread και απελευθερώνει τους σχετικούς πόρους.
~thread();
Παράμετροι#
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Μια προηγουμένως καθορισμένη συνάρτηση που θα εκτελεστεί στο νέο νήμα. |
|
|
Μια προηγουμένως ορισμένη συνάρτηση που δέχεται ένα όρισμα δείκτη κενού και θα εκτελεστεί στο νέο νήμα. |
|
|
Ένας δείκτης κενού που διαβιβάζεται στη συνάρτηση επανάκλησης. |
Σημειώσεις#
Μια συνάρτηση πρέπει πάντα να ορίζεται πριν την κλήση της.
Όταν δημιουργείτε ένα νήμα, μπορείτε να του δώσετε ένα όνομα για να το διαχειρίζεστε ξεχωριστά στο έργο σας.
Μόλις ένα νήμα σταματήσει χρησιμοποιώντας την συνάρτηση
interrupt(), δεν μπορεί να επανεκκινηθεί. Για να το εκτελέσετε ξανά, πρέπει να δημιουργήσετε ένα νέο νήμα.
Παράδειγμα#
Ορίστε τη συνάρτηση (εκτός του
int main())// Drive forward while blinking screen void blinkScreen() { while (true) { Brain.Screen.clearScreen(red); wait(0.5, seconds); Brain.Screen.clearScreen(); wait(0.5, seconds); } }Καταχωρίστε το νήμα μέσα στο
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Begin project code thread blinkScreenThread = thread(blinkScreen); Drivetrain.drive(forward); }
Ορίστε τη συνάρτηση (εκτός του
int main())// Run multiple threads simultaneously // Turn right, blink screen at once void blinkScreen() { while (true) { Brain.Screen.clearScreen(red); wait(0.5, seconds); Brain.Screen.clearScreen(); wait(0.5, seconds); } } void turning() { Drivetrain.turn(right); }Καταχωρίστε το νήμα μέσα στο
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Begin project code thread blinkScreenThread = thread(blinkScreen); thread turningThread = thread(turning); }
Συναρτήσεις Μελών#
Η κλάση νήματος περιλαμβάνει τις ακόλουθες συναρτήσεις-μέλη:
interrupt– Διακόπτει ένα νήμα χειροκίνητα, χρήσιμο για την παύση της συμπεριφοράς στο παρασκήνιο.
interrupt#
Διακόπτει ένα νήμα χειροκίνητα, κάτι που είναι χρήσιμο όταν μια εργασία δεν χρειάζεται πλέον ή όταν ένα πρόγραμμα χρειάζεται να επαναφέρει τα νήματα.
Available Functionsvoid interrupt();
Αυτή η συνάρτηση δεν έχει παραμέτρους.
Return ValuesΑυτή η συνάρτηση δεν επιστρέφει τιμή.
NotesΜόλις ένα νήμα σταματήσει, δεν μπορεί να επανεκκινηθεί. Για να το εκτελέσετε ξανά, πρέπει να δημιουργήσετε ένα νέο νήμα χρησιμοποιώντας το
thread.Αυτό είναι χρήσιμο όταν μια εργασία δεν είναι πλέον απαραίτητη ή όταν ένα πρόγραμμα χρειάζεται να επαναφέρει ή να αναθέσει εκ νέου τα νήματα.
Ορίστε τη συνάρτηση (εκτός του
int main())// Loop through red and green void colorLoop() { while (true) { Brain.Screen.drawRectangle(0, 120, 480, 120, red); wait(0.5, seconds); Brain.Screen.drawRectangle(0, 120, 480, 120, green); wait(0.5, seconds); } } // Display the current heading void displayHeading() { Brain.Screen.setFont(prop60); while (true) { Brain.Screen.clearLine(1); Brain.Screen.setCursor(1, 1); Brain.Screen.print( "Heading: %.1f", DrivetrainInertial.heading(degrees) ); wait(50, msec); } }Καταχωρίστε το νήμα μέσα στο
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Turn right, change screen color, and display heading at once thread colorThread = thread(colorLoop); thread displayHeadingThread = thread(displayHeading); Drivetrain.turn(right); wait(2, seconds); // Stop the flashing colors colorThread.interrupt(); }