Fils#

Introduction#

Les threads permettent à un robot d’exécuter plusieurs tâches simultanément au sein d’un même programme. Ils rendent possible le multitâche, permettant au robot d’effectuer des actions indépendantes en même temps.

Constructeurs de classes#

1 — Crée et démarre un nouveau thread avec une fonction.

thread( void (* callback)(void) );

2 — Crée et démarre un nouveau thread avec une fonction qui accepte un argument.

thread( int (* callback)(void *), void *arg );

Destructeur de classe#

Destroys the thread object and releases associated resources.

~thread();

Paramètres#

Paramètre

Taper

Description

callback

void (*)(void)

Une fonction préalablement définie qui sera exécutée dans le nouveau thread.

callback

int (*)(void *)

Une fonction préalablement définie qui accepte un argument de type pointeur void et qui s’exécutera dans le nouveau thread.

arg

void *

Un pointeur void passé à la fonction de rappel.

Notes#

  • Une fonction doit toujours être définie avant d’être appelée.

  • Lorsque vous créez un thread, vous pouvez le nommer afin de le gérer individuellement dans votre projet.

  • Une fois qu’un thread est arrêté à l’aide de interrupt(), il ne peut pas être redémarré. Pour l’exécuter à nouveau, vous devez créer un nouveau thread.

Exemple#

Définissez la fonction (en dehors de 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);
  }
}

Enregistrez le thread à l’intérieur de 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);
}

Définissez la fonction (en dehors de 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);
}

Enregistrez le thread à l’intérieur de 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);
}

Fonctions des membres#

La classe Thread comprend les fonctions membres suivantes :

  • interrupt – Arrête un thread manuellement, utile pour interrompre le comportement en arrière-plan.

interrupt#

Permet d’arrêter manuellement un thread, ce qui est utile lorsqu’une tâche n’est plus nécessaire ou lorsqu’un programme doit réinitialiser des threads.

Available Functions
void interrupt();

Parameters

Cette fonction ne possède pas de paramètres.

Return Values

Cette fonction ne renvoie aucune valeur.

Notes
  • Une fois un thread arrêté, il ne peut pas être redémarré. Pour le relancer, vous devez créer un nouveau thread à l’aide de la fonction thread.

  • Ceci est utile lorsqu’une tâche n’est plus nécessaire ou lorsqu’un programme doit réinitialiser ou réaffecter des threads.

Examples

Définissez la fonction (en dehors de 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);
  }
}

Enregistrez le thread à l’intérieur de 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();
}