活动#
介绍#
事件允许你异步启动函数。当一个事件被广播时,该事件的回调函数会在它自己的任务(线程)中启动,因此你的主代码可以同时继续运行。
Important: An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.
如果你希望一个触发器触发多个事件,那么:
从单个回调函数调用多个辅助函数,或者
使用多个事件对象并分别广播它们。
使用单独的线程独立运行任务。
要创建和使用事件,请按以下步骤操作:
Create the event with
event.Set the event’s callback using the event name (ex:
myEvent(myCallback);).Broadcast an
event:broadcast— Triggers all registered functions in an event object to run in parallel.broadcastAndWait— Triggers all registered functions in an event object and waits for them to finish before continuing.
类构造函数#
1 — Creates an
eventobject without a callback function.event();
2 — Creates an
eventobject with a callback function.event( void (* callback)(void) );
3 — Creates an
eventobject from another event with a callback function.event( event v, void (* callback)(void) );
4 — Creates an
eventobject with a callback function that accepts an argument.event( void (* callback)(void *), void *arg );
5 — Creates an
eventobject from another event with a callback function that accepts an argument.event( event v, void (* callback)(void *), void *arg );
类析构函数#
Destroys the event object and releases associated resources.
~event();
参数#
范围 |
类型 |
描述 |
|---|---|---|
|
|
预先定义好在事件广播时执行的函数。 |
|
|
要从中复制的现有事件对象。 |
|
|
接受 void 指针参数并在事件广播时执行的函数。 |
|
|
指向将要传递给回调函数的数据的指针。 |
笔记#
An
eventobject stores one callback. If you register another function with the same event object, it replaces the previous callback.如果你希望一个触发器触发多个事件,那么:
从单个回调函数调用多个辅助函数,或者
使用多个事件对象并分别广播它们。
使用单独的线程独立运行任务。
例子#
// Create a callback function
void onMyEvent() {
Brain.Screen.print("Callback function executed!");
}
// Create an event called myEvent
// Set onMyEvent as the callback function
event myEvent(onMyEvent);
成员功能#
The event class includes the following member functions:
operator— Sets a callback function for the event.broadcast— Triggers the event’s callback function to run in parallel.broadcastAndWait— Triggers the event’s callback function and waits for completion.
Before calling any event member functions, an event instance must be created, as shown below:
/* 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);
}
// 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 starts the event’s callback and continues immediately.
void broadcast();
此函数不接受任何参数。
Return Values此函数不返回值。
Examples// Create a callback function
void onMyEvent() {
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
Brain.Screen.print("Event fired!");
}
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仅用于会结束的回调函数(不要用于无限循环)。
这是一个等待函数,它会阻塞执行,直到回调完成或超时。
void startDriving() {
Drivetrain.drive(forward);
wait(2, seconds);
}
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!");