Wątki#
Wstęp#
Wątki pozwalają robotowi wykonywać wiele zadań jednocześnie w ramach tego samego programu. Umożliwiają one wielozadaniowość, pozwalając robotowi wykonywać niezależne czynności w tym samym czasie.
Konstruktory klas#
1 — Tworzy i uruchamia nowy wątek z funkcją.
thread( void (* callback)(void) );
2 — Tworzy i uruchamia nowy wątek z funkcją akceptującą argument.
thread( int (* callback)(void *), void *arg );
Destruktor klasy#
Niszczy obiekt wątku thread i zwalnia powiązane zasoby.
~thread();
Parametry#
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Wcześniej zdefiniowana funkcja, która zostanie uruchomiona w nowym wątku. |
|
|
Wcześniej zdefiniowana funkcja akceptująca argument wskaźnika typu void i uruchomiona w nowym wątku. |
|
|
Wskaźnik typu void przekazywany do funkcji wywołania zwrotnego. |
Notatki#
Funkcja musi być zawsze zdefiniowana przed jej wywołaniem.
Podczas tworzenia wątku możesz nadać mu nazwę, aby zarządzać nim indywidualnie w ramach projektu.
Po zatrzymaniu wątku za pomocą
interrupt()nie można go ponownie uruchomić. Aby go ponownie uruchomić, należy utworzyć nowy wątek.
Przykład#
Zdefiniuj funkcję (poza
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); } }Zarejestruj wątek wewnątrz
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); }
Zdefiniuj funkcję (poza
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); }Zarejestruj wątek wewnątrz
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); }
Funkcje członkowskie#
Klasa wątków zawiera następujące funkcje członkowskie:
interrupt– Zatrzymuje wątek ręcznie, przydatne do zatrzymania działania w tle.
interrupt#
Zatrzymuje wątek ręcznie, co jest przydatne, gdy zadanie nie jest już potrzebne lub gdy program musi zresetować wątki.
Available Functionsvoid interrupt();
Ta funkcja nie ma parametrów.
Return ValuesTa funkcja nie zwraca wartości.
NotesPo zatrzymaniu wątku nie można go ponownie uruchomić. Aby go ponownie uruchomić, należy utworzyć nowy wątek za pomocą
thread.Jest to przydatne, gdy zadanie nie jest już potrzebne lub gdy program musi zresetować lub ponownie przypisać wątki.
Zdefiniuj funkcję (poza
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); } }Zarejestruj wątek wewnątrz
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(); }