Події#

Вступ#

Події дозволяють запускати функцію асинхронно. Коли подія транслюється, функція зворотного виклику події запускається в окремому завданні (потоці), тому ваш основний код може продовжувати виконуватися одночасно.

Важливо: Об’єкт події event зберігає один зворотний виклик. Якщо ви зареєструєте іншу функцію з тим самим об’єктом події, вона замінить попередній зворотний виклик.

Якщо ви хочете, щоб один тригер відбувався одночасно, виконайте одне з наведених нижче дій.

  • Виклик кількох допоміжних функцій з одного зворотного виклику, або

  • Використовуйте кілька об’єктів подій та транслюйте кожен з них.

  • Використовуйте окремі потоки для незалежного виконання завдань.

Щоб створити та використовувати подію, виконайте такі дії в такому порядку:

  1. Створіть подію з event.

  2. Встановити зворотний виклик події з використанням назви події (наприклад: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Запускає всі зареєстровані функції в об’єкті події для паралельного виконання.

    • broadcastAndWait — Запускає всі зареєстровані функції в об’єкті події та очікує їх завершення, перш ніж продовжити.

Конструктори класів#

1 — Створює об’єкт події event без функції зворотного виклику.

event();

2 — Створює об’єкт події event з функцією зворотного виклику.

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

3 — Створює об’єкт події event з іншої події за допомогою функції зворотного виклику.

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

4 — Створює об’єкт події event з функцією зворотного виклику, яка приймає аргумент.

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

5 — Створює об’єкт події event з іншої події за допомогою функції зворотного виклику, яка приймає аргумент.

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

Деструктор класів#

Знищує об’єкт події event та звільняє пов’язані з ним ресурси.

~event();

Параметри#

Параметр

Тип

Опис

callback

void (*)(void)

Функція, яку попередньо визначено для виконання під час трансляції події.

v

event

Існуючий об’єкт події для копіювання.

callback

void (*)(void *)

Функція, яка приймає аргумент void-покажчик та виконується, коли подія транслюється.

arg

void *

Вказівник на дані, які будуть передані до функції зворотного виклику.

Нотатки#

  • Об’єкт події event зберігає один зворотний виклик. Якщо зареєструвати іншу функцію з тим самим об’єктом події, вона замінить попередній зворотний виклик.

  • Якщо ви хочете, щоб один тригер відбувався одночасно, виконайте одне з наведених нижче дій.

    • Виклик кількох допоміжних функцій з одного зворотного виклику, або

    • Використовуйте кілька об’єктів подій та транслюйте кожен з них.

    • Використовуйте окремі потоки для незалежного виконання завдань.

Приклад#

Визначити функцію зворотного виклику (поза int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

Зареєструйте зворотний виклик всередині 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);
}

Функції-члени#

Клас event містить такі функції-члени:

  • operator — Встановлює функцію зворотного виклику для події.

  • broadcast — Запускає паралельне виконання функції зворотного виклику події.

  • broadcastAndWait — Запускає функцію зворотного виклику події та очікує завершення.

Перед викликом будь-яких функцій-членів з подією event необхідно створити екземпляр події event , як показано нижче:

/* 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#

Встановлює функцію зворотного виклику для події за допомогою оператора виклику функції.

Available Functions
void operator()( void (* callback)() );

Parameters

Параметр

Тип

Опис

callback

void (*)(void)

Попередньо визначена функція зворотного виклику, яка викликається автоматично під час трансляції події. Функція повинна відповідати необхідному підпису зворотного виклику. Див. Функції зворотного виклику для отримання додаткової інформації.

Return Values

Ця функція не повертає значення.

Notes
  • Повторне встановлення зворотного виклику замінює попередній зворотний виклик.

  • Функція зворотного виклику не повинна мати параметрів та повертати значення void.

Examples

Визначити функції зворотного виклику (поза 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);
}

Зареєструйте зворотний виклик всередині 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#

broadcast запускає зворотний виклик події та негайно продовжується.

Member Functions
void broadcast();

Parameters

Ця функція не приймає жодних параметрів.

Return Values

Ця функція не повертає значення.

Examples

Визначити функцію зворотного виклику (поза int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

Зареєструйте зворотний виклик всередині 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#

Запускає зворотний виклик та очікує його завершення (або тайм-ауту).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Параметр

Тип

Опис

timeout

int32_t

Кількість мілісекунд, яку потрібно зачекати перед повторним початком виконання коду (за замовчуванням — 60000).

Return Values

Ця функція не повертає значення.

Notes
  • Використовуйте це лише з зворотними викликами, які завершуються (без нескінченних циклів).

  • Це функція очікування, яка блокує виконання, доки зворотний виклик не завершиться або не мине час очікування.

Examples

Визначити функцію зворотного виклику (поза int main())

// Create a callback function
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

Зареєструйте зворотний виклик всередині 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!");
}