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#
// Create a callback function
void onMyEvent() {
Brain.Screen.print("Callback function executed!");
}
int main() {
// Create an event called myEvent and 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.
void drawSquare() {
Brain.Screen.clearScreen();
Brain.Screen.drawRectangle(40, 40, 120, 120);
}
void drawCircle() {
Brain.Screen.clearScreen();
Brain.Screen.drawCircle(100, 100, 60);
}
int main() {
// 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.
Examples// Create a callback function.
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Event fired!");
}
int main() {
Brain.Screen.print("Broadcasting in 2 seconds...");
// Create an event called myEvent and 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.
void startDriving() {
Drivetrain.drive(forward);
wait(2, seconds);
}
int main() {
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!");
}