События#
Введение#
События позволяют запускать функцию асинхронно. Когда событие транслируется, функция обратного вызова этого события запускается в отдельной задаче (потоке), поэтому ваш основной код может продолжать выполняться одновременно.
Важно: Объект события 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хранит один коллбэк. Если вы регистрируете другую функцию с тем же объектом события, она заменит предыдущий коллбэк.Если вы хотите, чтобы от одного триггера происходило несколько событий, используйте один из следующих вариантов:
Вызывайте несколько вспомогательных функций из одной функции обратного вызова, или
Используйте несколько объектов событий и транслируйте каждое из них.
Используйте отдельные потоки для независимого выполнения задач.
Пример#
// 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);
}
Функции участников#
Класс 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.
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#
broadcast запускает обратный вызов события и немедленно продолжается.
void broadcast();
Эта функция не принимает никаких параметров.
Return ValuesЭта функция не возвращает значения.
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#
Запускает функцию обратного вызова и ожидает её завершения (или истечения времени ожидания).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Параметр |
Тип |
Описание |
|---|---|---|
|
|
Количество миллисекунд, которое нужно подождать, прежде чем код снова начнет выполняться (по умолчанию 60000). |
Эта функция не возвращает значения.
NotesИспользуйте это только с функциями обратного вызова, которые завершаются (без бесконечных циклов).
Это функция ожидания, которая блокирует выполнение до тех пор, пока не завершится или не истечет время ожидания обратного вызова.
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!");
}