Теми#
Вступ#
Потоки дозволяють роботу виконувати кілька завдань одночасно в одній програмі. Вони забезпечують багатозадачність, дозволяючи роботу виконувати незалежні дії одночасно.
Конструктори класів#
1 — Створює та запускає новий потік з функцією.
thread( void (* callback)(void) );
2 — Створює та запускає новий потік з функцією, яка приймає аргумент.
thread( int (* callback)(void *), void *arg );
Деструктор класів#
Знищує об’єкт thread та звільняє пов’язані з ним ресурси.
~thread();
Параметри#
Параметр |
Тип |
Опис |
|---|---|---|
|
|
Попередньо визначена функція, яка виконуватиметься в новому потоці. |
|
|
Раніше визначена функція, яка приймає аргумент void-покажчик і буде виконуватися в новому потоці. |
|
|
Вказівник типу void, який передається до функції зворотного виклику. |
Нотатки#
Функцію завжди потрібно визначити перед її викликом.
Коли ви створюєте потік, ви можете надати йому назву, щоб керувати ним окремо у вашому проєкті.
Після зупинки потоку за допомогою
interrupt()його не можна перезапустити. Щоб запустити його знову, потрібно створити новий потік.
Приклад#
Визначити функцію (поза
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); } }Зареєструвати потік всередині
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); }
Визначити функцію (поза
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); }Зареєструвати потік всередині
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); }
Функції-члени#
Клас thread містить такі функції-члени:
interrupt– Зупиняє потік вручну, корисно для зупинки фонової поведінки.
interrupt#
Зупиняє потік вручну, що корисно, коли завдання більше не потрібне або коли програмі потрібно скинути потоки.
Available Functionsvoid interrupt();
Ця функція не має параметрів.
Return ValuesЦя функція не повертає значення.
NotesПісля зупинки потоку його не можна перезапустити. Щоб запустити його знову, потрібно створити новий потік за допомогою
thread.Це корисно, коли завдання більше не потрібне або коли програмі потрібно скинути чи перепризначити потоки.
Визначити функцію (поза
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); } }Зареєструвати потік всередині
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(); }