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:

  1. Utwórz zdarzenie za pomocą event.

  2. Ustaw wywołanie zwrotne zdarzenia używając nazwy zdarzenia (np.: myEvent(myCallback);).

  3. 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 event bez funkcji wywołania zwrotnego.

event();

2 — Tworzy obiekt zdarzenia event z funkcją wywołania zwrotnego.

event( void (* callback)(void) );

3 — Tworzy obiekt zdarzenia event z innego zdarzenia z funkcją wywołania zwrotnego.

event( 
  event v, 
  void (* callback)(void) );

4 — Tworzy obiekt zdarzenia event z funkcją wywołania zwrotnego, która akceptuje argument.

event( void (* callback)(void *), void *arg );

5 — Tworzy obiekt zdarzenia event z 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

callback

void (*)(void)

Funkcja zdefiniowana wcześniej do wykonania, gdy zdarzenie zostanie nadane.

v

event

Istniejący obiekt zdarzenia, z którego można kopiować.

callback

void (*)(void *)

Funkcja przyjmująca argument wskaźnika typu void i wykonywana po rozgłoszeniu zdarzenia.

arg

void *

Wskaźnik do danych, które zostaną przekazane do funkcji wywołania zwrotnego.

Notatki#

  • 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.

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:

  • operatoroperator — 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 Functions
void operator()( void (* callback)() );

Parameters

Parametr

Typ

Opis

callback

void (*)(void)

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.

Return Values

Ta funkcja nie zwraca wartości.

Notes
  • Ponowne 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.

Examples

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.

Member Functions
void broadcast();

Parameters

Funkcja ta nie przyjmuje żadnych parametrów.

Return Values

Ta funkcja nie zwraca wartości.

Examples

Zdefiniuj 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 Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Parametr

Typ

Opis

timeout

int32_t

Liczba milisekund, które należy odczekać przed ponownym rozpoczęciem wykonywania kodu (domyślnie 60000).

Return Values

Ta funkcja nie zwraca wartości.

Notes
  • Uż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.

Examples

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!");
}