Draden#
Invoering#
Threads stellen een robot in staat om meerdere taken tegelijkertijd binnen hetzelfde programma uit te voeren. Ze maken multitasking mogelijk, waardoor de robot onafhankelijke acties tegelijkertijd kan uitvoeren.
Klasseconstructors#
1 — Maakt en start een nieuwe thread met een functie.
thread( void (* callback)(void) );
2 — Maakt en start een nieuwe thread met een functie die een argument accepteert.
thread( int (* callback)(void *), void *arg );
Klasse-destructor#
Vernietigt het object met thread thread en geeft de bijbehorende resources vrij.
~thread();
Parameters#
Parameter |
Type |
Beschrijving |
|---|---|---|
|
|
Een eerder gedefinieerde functie die in de nieuwe thread zal worden uitgevoerd. |
|
|
Een eerder gedefinieerde functie die een void-pointerargument accepteert en in de nieuwe thread wordt uitgevoerd. |
|
|
Een pointer naar een leeg object die wordt doorgegeven aan de callbackfunctie. |
Notities#
Een functie moet altijd gedefinieerd zijn voordat deze wordt aangeroepen.
Wanneer je een thread aanmaakt, kun je deze een naam geven om hem individueel te beheren binnen je project.
Als een thread eenmaal is gestopt met interrupt()
interrupt()kan deze niet opnieuw worden gestart. Om hem opnieuw uit te voeren, moet u een nieuwe thread maken.
Voorbeeld#
Definieer de functie (buiten
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); } }Registreer de thread binnen
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); }
Definieer de functie (buiten
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); }Registreer de thread binnen
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); }
Lidfuncties#
De threadklasse bevat de volgende lidfuncties:
interrupt– Stopt een thread handmatig, handig om achtergrondgedrag te stoppen.
interrupt#
Hiermee wordt een thread handmatig gestopt. Dit is handig wanneer een taak niet langer nodig is of wanneer een programma threads moet resetten.
Available Functionsvoid interrupt();
Deze functie heeft geen parameters.
Return ValuesDeze functie retourneert geen waarde.
NotesAls een thread eenmaal is gestopt, kan deze niet opnieuw worden gestart. Om de thread opnieuw uit te voeren, moet u een nieuwe thread maken met behulp van
thread.Dit is handig wanneer een taak niet langer nodig is of wanneer een programma threads moet resetten of opnieuw moet toewijzen.
Definieer de functie (buiten
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); } }Registreer de thread binnen
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(); }