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

callback

void (*)(void)

Eine zuvor definierte Funktion, die im neuen Thread ausgeführt wird.

callback

int (*)(void *)

Eine zuvor definierte Funktion, die einen Void-Pointer als Argument akzeptiert und im neuen Thread ausgeführt wird.

arg

void *

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 Functions
void interrupt();

Parameters

Diese Funktion hat keine Parameter.

Return Values

Diese Funktion gibt keinen Wert zurück.

Notes
  • Ein angehaltener Thread kann nicht neu gestartet werden. Um ihn erneut auszuführen, muss ein neuer Thread mit thread erstellt werden.

  • Dies ist nützlich, wenn eine Aufgabe nicht mehr benötigt wird oder wenn ein Programm Threads zurücksetzen oder neu zuweisen muss.

Examples

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();
}