Wydarzenia#
Wstęp#
Zdarzenia pozwalają na asynchroniczne uruchamianie funkcji. Gdy zdarzenie jest rozgłaszane, funkcja wywołania zwrotnego zdarzenia jest uruchamiana w osobnym zadaniu (wątku), dzięki czemu kod główny może być nadal wykonywany w tym samym czasie.
Ważne: Obiekt zdarzenia event przechowuje jedno wywołanie zwrotne. Jeśli zarejestrujesz inną funkcję z tym samym obiektem zdarzenia, zastąpi ona poprzednie wywołanie zwrotne.
Jeśli chcesz, aby jeden wyzwalacz spowodował wystąpienie kilku zdarzeń, wykonaj jedną z następujących czynności:
Wywołanie wielu funkcji pomocniczych z jednego wywołania zwrotnego lub
Użyj wielu obiektów zdarzeń i roześlij każdy z nich.
Użyj oddzielnych wątków, aby uruchamiać zadania niezależnie.
Aby utworzyć i następnie użyć zdarzenia, wykonaj kolejno poniższe kroki:
Utwórz zdarzenie za pomocą
event.Ustaw wywołanie zwrotne zdarzenia używając nazwy zdarzenia (np.:
myEvent(myCallback);).Broadcast an
event:broadcast— Uruchamia wszystkie zarejestrowane funkcje w obiekcie zdarzenia, aby działały równolegle.broadcastAndWait— Uruchamia wszystkie zarejestrowane funkcje w obiekcie zdarzenia i czeka na ich zakończenie przed kontynuowaniem.
Konstruktory klas#
1 — Tworzy obiekt zdarzenia
eventbez funkcji wywołania zwrotnego.event();
2 — Tworzy obiekt zdarzenia
eventz funkcją wywołania zwrotnego.event( void (* callback)(void) );
3 — Tworzy obiekt zdarzenia
eventz innego zdarzenia z funkcją wywołania zwrotnego.event( event v, void (* callback)(void) );
4 — Tworzy obiekt zdarzenia
eventz funkcją wywołania zwrotnego, która akceptuje argument.event( void (* callback)(void *), void *arg );
5 — Tworzy obiekt zdarzenia
eventz innego zdarzenia z funkcją wywołania zwrotnego, która akceptuje argument.event( event v, void (* callback)(void *), void *arg );
Destruktor klasy#
Niszczy obiekt zdarzenia event i uwalnia powiązane zasoby.
~event();
Parametry#
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Funkcja zdefiniowana wcześniej do wykonania, gdy zdarzenie zostanie nadane. |
|
|
Istniejący obiekt zdarzenia, z którego można kopiować. |
|
|
Funkcja przyjmująca argument wskaźnika typu void i wykonywana po rozgłoszeniu zdarzenia. |
|
|
Wskaźnik do danych, które zostaną przekazane do funkcji wywołania zwrotnego. |
Notatki#
Obiekt zdarzenia
eventprzechowuje jedno wywołanie zwrotne. Jeśli zarejestrujesz inną funkcję z tym samym obiektem zdarzenia, zastąpi ona poprzednie wywołanie zwrotne.Jeśli chcesz, aby jeden wyzwalacz spowodował wystąpienie kilku zdarzeń, wykonaj jedną z następujących czynności:
Wywołanie wielu funkcji pomocniczych z jednego wywołania zwrotnego lub
Użyj wielu obiektów zdarzeń i roześlij każdy z nich.
Użyj oddzielnych wątków, aby uruchamiać zadania niezależnie.
Przykład#
Zdefiniuj funkcję wywołania zwrotnego (poza
int main())// Create a callback function void onMyEvent() { Brain.Screen.print("Callback function executed!"); }Zarejestruj wywołanie zwrotne wewnątrz
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create an event called myEvent // Set onMyEvent as the callback function event myEvent(onMyEvent); }
Funkcje członkowskie#
Klasa zdarzenia event zawiera następujące funkcje członkowskie:
operator
operator— Ustawia funkcję wywołania zwrotnego dla zdarzenia.broadcast— Wyzwala funkcję wywołania zwrotnego zdarzenia, aby działała równolegle.broadcastAndWait— Uruchamia funkcję wywołania zwrotnego zdarzenia i czeka na zakończenie.
Przed wywołaniem jakiejkolwiek funkcji członkowskiej zdarzenia event należy utworzyć instancję zdarzenia event , jak pokazano poniżej:
/* This constructor is required when using VS Code.
Event configuration can be created with or without
a callback function as shown in the examples above. */
// Create an event without a callback
event myEvent;
// Or create an event with a callback
event myEvent(onMyEvent);
operator#
Ustawia funkcję wywołania zwrotnego dla zdarzenia za pomocą operatora wywołania funkcji.
Available Functionsvoid operator()( void (* callback)() );
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Wcześniej zdefiniowana funkcja wywołania zwrotnego, która jest wywoływana automatycznie po nadaniu zdarzenia. Funkcja musi być zgodna z wymaganym podpisem wywołania zwrotnego. Więcej informacji można znaleźć w sekcji Funkcje wywołania zwrotnego. |
Ta funkcja nie zwraca wartości.
NotesPonowne ustawienie wywołania zwrotnego powoduje zastąpienie poprzedniego wywołania zwrotnego.
Funkcja wywołania zwrotnego nie może mieć żadnych parametrów i zwracać wartość void.
Zdefiniuj funkcje wywołania zwrotnego (poza
int main())// Create a callback function void drawSquare() { Brain.Screen.clearScreen(); Brain.Screen.drawRectangle(40, 40, 120, 120); }void drawCircle() { Brain.Screen.clearScreen(); Brain.Screen.drawCircle(100, 100, 60); }Zarejestruj wywołanie zwrotne wewnątrz
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); // Create the event drawEvent event drawEvent; Brain.Screen.print("Drawing a square..."); // Set the event to drawSquare drawEvent(drawSquare); wait(1, seconds); // Trigger the event drawEvent.broadcast(); wait(1, seconds); Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Drawing a circle..."); // Replace drawSquare with drawCircle drawEvent(drawCircle); wait(1, seconds); // Trigger the event a second time drawEvent.broadcast(); }
broadcast#
Transmisja broadcast rozpoczyna wywołanie zwrotne zdarzenia i natychmiast kontynuuje.
void broadcast();
Funkcja ta nie przyjmuje żadnych parametrów.
Return ValuesTa funkcja nie zwraca wartości.
ExamplesZdefiniuj funkcję wywołania zwrotnego (poza
int main())// Create a callback function void onMyEvent() { Brain.Screen.clearScreen(); Brain.Screen.setCursor(1, 1); Brain.Screen.print("Event fired!"); }Zarejestruj wywołanie zwrotne wewnątrz
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); Brain.Screen.print("Broadcasting in 2 seconds..."); // Create an event called myEvent // Set onMyEvent as the callback function event myEvent(onMyEvent); wait(2, seconds); // Trigger the event myEvent.broadcast(); }
broadcastAndWait#
Rozpoczyna wywołanie zwrotne i czeka, aż się zakończy (lub upłynie limit czasu).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parametr |
Typ |
Opis |
|---|---|---|
|
|
Liczba milisekund, które należy odczekać przed ponownym rozpoczęciem wykonywania kodu (domyślnie 60000). |
Ta funkcja nie zwraca wartości.
NotesUżywaj tego tylko w przypadku wywołań zwrotnych, które się kończą (bez pętli nieskończonych).
Jest to funkcja oczekująca, która blokuje wykonywanie do momentu zakończenia wywołania zwrotnego lub upłynięcia limitu czasu.
Zdefiniuj funkcję wywołania zwrotnego (poza
int main())// Create a callback function void startDriving() { Drivetrain.drive(forward); wait(2, seconds); }Zarejestruj wywołanie zwrotne wewnątrz
int main()int main() { /* vexcodeInit() is only required when using VEXcode. Remove vexcodeInit() if compiling in VS Code. */ vexcodeInit(); Brain.Screen.print("Starting drive..."); event driveEvent(startDriving); // Give the event time to be set wait(0.25, seconds); // Run the event and wait until it finishes driveEvent.broadcastAndWait(); // Stop driving after 2 seconds Drivetrain.stop(); Brain.Screen.clearScreen(); Brain.Screen.print("Drive complete!"); }