События#
Введение#
События позволяют запускать функцию асинхронно. Когда событие транслируется, функция обратного вызова этого события запускается в отдельной задаче (потоке), поэтому ваш основной код может продолжать выполняться одновременно.
Важно: Объект события event хранит один коллбэк. Если вы зарегистрируете другую функцию с тем же объектом события, она заменит предыдущий коллбэк.
Если вы хотите, чтобы от одного триггера происходило несколько событий, используйте один из следующих вариантов:
Вызывайте несколько вспомогательных функций из одной функции обратного вызова, или
Используйте несколько объектов событий и транслируйте каждое из них.
Используйте отдельные потоки для независимого выполнения задач.
Для создания и последующего использования события выполните следующие действия в указанном порядке:
Создайте событие с помощью
event.Установите функцию обратного вызова события используя имя события (например:
myEvent(myCallback);).Broadcast an
event:broadcast— Запускает все зарегистрированные функции в объекте события для параллельного выполнения.broadcastAndWait— Запускает все зарегистрированные функции в объекте события и ожидает их завершения, прежде чем продолжить.
Конструкторы классов#
1 — Создает объект события
eventбез функции обратного вызова.event();
2 — Creates an
eventobject 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();
Параметры#
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Функция, которая была предварительно определена и должна быть выполнена при трансляции события. |
|
|
Существующий объект события, из которого нужно скопировать данные. |
|
|
Функция, которая принимает в качестве аргумента указатель типа 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 Functionsvoid operator()( void (* callback)() );
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Ранее определенная функция обратного вызова, которая вызывается автоматически при трансляции события. Функция должна соответствовать требуемой сигнатуре функции обратного вызова. См. Функции обратного вызова для получения дополнительной информации. |
Эта функция не возвращает значения.
NotesПовторная установка функции обратного вызова заменяет предыдущую.
Функция обратного вызова не должна иметь параметров и должна возвращать значение void.
Определите функции обратного вызова (вне
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 запускает обратный вызов события и немедленно продолжается.
void broadcast();
Эта функция не принимает никаких параметров.
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 Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Количество миллисекунд, которое нужно подождать, прежде чем код снова начнет выполняться (по умолчанию 60000). |
Эта функция не возвращает значения.
NotesИспользуйте это только с функциями обратного вызова, которые завершаются (без бесконечных циклов).
Это функция ожидания, которая блокирует выполнение до тех пор, пока не завершится или не истечет время ожидания обратного вызова.
Определите функцию обратного вызова (вне
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!"); }