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

callback

void (*)(void)

Een eerder gedefinieerde functie die in de nieuwe thread zal worden uitgevoerd.

callback

int (*)(void *)

Een eerder gedefinieerde functie die een void-pointerargument accepteert en in de nieuwe thread wordt uitgevoerd.

arg

void *

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

Parameters

Deze functie heeft geen parameters.

Return Values

Deze functie retourneert geen waarde.

Notes
  • Als 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.

Examples

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