Νήματα#
Εισαγωγή#
Τα νήματα επιτρέπουν σε ένα ρομπότ να εκτελεί πολλαπλές εργασίες ταυτόχρονα μέσα στο ίδιο πρόγραμμα. Επιτρέπουν την εκτέλεση πολλαπλών εργασιών, επιτρέποντας στο ρομπότ να εκτελεί ανεξάρτητες ενέργειες ταυτόχρονα.
Κατασκευαστές κλάσεων#
1 — Δημιουργεί και ξεκινά ένα νέο νήμα με μια συνάρτηση.
thread( void (* callback)(void) );
2 — Δημιουργεί και ξεκινά ένα νέο νήμα με μια συνάρτηση που δέχεται ένα όρισμα.
thread( int (* callback)(void *), void *arg );
Καταστροφέας κλάσης#
Destroys the thread object and releases associated resources.
~thread();
Παράμετροι#
Παράμετρος |
Τύπος |
Περιγραφή |
|---|---|---|
|
|
Μια προηγουμένως καθορισμένη συνάρτηση που θα εκτελεστεί στο νέο νήμα. |
|
|
Μια προηγουμένως ορισμένη συνάρτηση που δέχεται ένα όρισμα δείκτη κενού και θα εκτελεστεί στο νέο νήμα. |
|
|
Ένας δείκτης κενού που διαβιβάζεται στη συνάρτηση επανάκλησης. |
Σημειώσεις#
Μια συνάρτηση πρέπει πάντα να ορίζεται πριν την κλήση της.
Όταν δημιουργείτε ένα νήμα, μπορείτε να του δώσετε ένα όνομα για να το διαχειρίζεστε ξεχωριστά στο έργο σας.
Once a thread is stopped using
interrupt(), it cannot be restarted. To run it again, you must create a new thread.
Παράδειγμα#
Define the function (outside of
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); } }Register the thread inside
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); }
Define the function (outside of
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); }Register the thread inside
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– Stops a thread manually, useful for halting background behavior.
interrupt#
Διακόπτει ένα νήμα χειροκίνητα, κάτι που είναι χρήσιμο όταν μια εργασία δεν χρειάζεται πλέον ή όταν ένα πρόγραμμα χρειάζεται να επαναφέρει τα νήματα.
Available Functionsvoid interrupt();
Αυτή η συνάρτηση δεν έχει παραμέτρους.
Return ValuesΑυτή η συνάρτηση δεν επιστρέφει τιμή.
NotesΜόλις ένα νήμα σταματήσει, δεν μπορεί να επανεκκινηθεί. Για να το εκτελέσετε ξανά, πρέπει να δημιουργήσετε ένα νέο νήμα χρησιμοποιώντας το
thread.Αυτό είναι χρήσιμο όταν μια εργασία δεν είναι πλέον απαραίτητη ή όταν ένα πρόγραμμα χρειάζεται να επαναφέρει ή να αναθέσει εκ νέου τα νήματα.
Define the function (outside of
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); } }Register the thread inside
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(); }