События#

Введение#

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

Важно: Объект события event хранит один коллбэк. Если вы зарегистрируете другую функцию с тем же объектом события, она заменит предыдущий коллбэк.

Если вы хотите, чтобы от одного триггера происходило несколько событий, используйте один из следующих вариантов:

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

  • Используйте несколько объектов событий и транслируйте каждое из них.

  • Используйте отдельные потоки для независимого выполнения задач.

Для создания и последующего использования события выполните следующие действия в указанном порядке:

  1. Создайте событие с помощью event.

  2. Установите функцию обратного вызова события используя имя события (например: myEvent(myCallback);).

  3. Broadcast an event:

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

    • broadcastAndWait — Запускает все зарегистрированные функции в объекте события и ожидает их завершения, прежде чем продолжить.

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

1 — Создает объект события event без функции обратного вызова.

event();

2 — Creates an event object with a callback function.

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