Fios#

Introdução#

Os threads permitem que um robô execute várias tarefas em simultâneo dentro do mesmo programa. Possibilitam a multitarefa, permitindo que o robô execute ações independentes ao mesmo tempo.

Construtores de Classes#

1 — Cria e inicia um novo thread com uma função.

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

2 — Cria e inicia um novo thread com uma função que aceita um argumento.

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

Destrutor de classes#

Destroys the thread object and releases associated resources.

~thread();

Parâmetros#

Parâmetro

Tipo

Descrição

callback

void (*)(void)

Uma função previamente definida que será executada no novo thread.

callback

int (*)(void *)

Uma função previamente definida que aceita um argumento ponteiro void e será executada num novo thread.

arg

void *

Um ponteiro vazio que é passado para a função de callback.

Notas#

  • Uma função deve ser sempre definida antes de ser chamada.

  • Ao criar uma thread, pode nomeá-la para a gerir individualmente no seu projeto.

  • Uma vez que uma thread é interrompida utilizando interrupt(), não pode ser reiniciada. Para a executar novamente, deve criar uma nova thread.

Exemplo#

Defina a função (fora 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);
  }
}

Registe o thread dentro 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);
}

Defina a função (fora 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);
}

Registe o thread dentro 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);
}

Funções de membro#

A classe Thread inclui as seguintes funções membro:

  • interrupt – Interrompe um thread manualmente, útil para interromper o comportamento em segundo plano.

interrupt#

Interrompe uma thread manualmente, o que é útil quando uma tarefa já não é necessária ou quando um programa necessita de reiniciar as threads.

Available Functions
void interrupt();

Parameters

Esta função não tem parâmetros.

Return Values

Esta função não devolve qualquer valor.

Notes
  • Uma vez que uma thread é interrompida, não pode ser reiniciada. Para a executar novamente, deve criar uma nova thread utilizando thread.

  • Isto é útil quando uma tarefa já não é necessária ou quando um programa necessita de reiniciar ou reatribuir threads.

Examples

Defina a função (fora 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);
  }
}

Registe o thread dentro 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();
}