Події#
Вступ#
Події дозволяють запускати функцію асинхронно. Коли подія транслюється, функція зворотного виклику події запускається в окремому завданні (потоці), тому ваш основний код може продовжувати виконуватися одночасно.
Важливо: Об’єкт події event зберігає один зворотний виклик. Якщо ви зареєструєте іншу функцію з тим самим об’єктом події, вона замінить попередній зворотний виклик.
Якщо ви хочете, щоб один тригер відбувався одночасно, виконайте одне з наведених нижче дій.
Виклик кількох допоміжних функцій з одного зворотного виклику, або
Використовуйте кілька об’єктів подій та транслюйте кожен з них.
Використовуйте окремі потоки для незалежного виконання завдань.
Щоб створити та використовувати подію, виконайте такі дії в такому порядку:
Створіть подію з
event.Встановити зворотний виклик події з використанням назви події (наприклад:
myEvent(myCallback);).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();
Параметри#
Параметр |
Тип |
Опис |
|---|---|---|
|
|
Функція, яку попередньо визначено для виконання під час трансляції події. |
|
|
Існуючий об’єкт події для копіювання. |
|
|
Функція, яка приймає аргумент 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!"); }