Threads#
Einführung#
Threads ermöglichen es einem Roboter, mehrere Aufgaben gleichzeitig innerhalb desselben Programms auszuführen. Sie ermöglichen Multitasking und erlauben dem Roboter, gleichzeitig unabhängige Aktionen durchzuführen.
Klassenkonstruktoren#
1 — Erstellt und startet einen neuen Thread mit einer Funktion.
thread( void (* callback)(void) );
2 — Erstellt und startet einen neuen Thread mit einer Funktion, die ein Argument akzeptiert.
thread( int (* callback)(void *), void *arg );
Klassendestruktor#
Zerstört das Objekt thread und gibt die zugehörigen Ressourcen frei.
~thread();
Parameter#
Parameter |
Typ |
Beschreibung |
|---|---|---|
|
|
Eine zuvor definierte Funktion, die im neuen Thread ausgeführt wird. |
|
|
Eine zuvor definierte Funktion, die einen Void-Pointer als Argument akzeptiert und im neuen Thread ausgeführt wird. |
|
|
Ein void-Pointer, der an die Callback-Funktion übergeben wird. |
Anmerkungen#
Eine Funktion muss immer vor ihrem Aufruf definiert werden.
Wenn Sie einen Thread erstellen, können Sie ihm einen Namen geben, um ihn in Ihrem Projekt individuell zu verwalten.
Sobald ein Thread mit
interrupt()gestoppt wurde, kann er nicht neu gestartet werden. Um ihn erneut auszuführen, muss ein neuer Thread erstellt werden.
Beispiel#
Definiere die Funktion (außerhalb von
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); } }Registriere den Thread innerhalb von
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); }
Definiere die Funktion (außerhalb von
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); }Registriere den Thread innerhalb von
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); }
Mitgliedsfunktionen#
Die Thread-Klasse umfasst die folgenden Memberfunktionen:
interrupt– Stoppt einen Thread manuell, nützlich zum Anhalten von Hintergrundprozessen.
interrupt#
Stoppt einen Thread manuell, was nützlich ist, wenn eine Aufgabe nicht mehr benötigt wird oder wenn ein Programm Threads zurücksetzen muss.
Available Functionsvoid interrupt();
Diese Funktion hat keine Parameter.
Return ValuesDiese Funktion gibt keinen Wert zurück.
NotesEin angehaltener Thread kann nicht neu gestartet werden. Um ihn erneut auszuführen, muss ein neuer Thread mit
threaderstellt werden.Dies ist nützlich, wenn eine Aufgabe nicht mehr benötigt wird oder wenn ein Programm Threads zurücksetzen oder neu zuweisen muss.
Definiere die Funktion (außerhalb von
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); } }Registriere den Thread innerhalb von
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(); }