กิจกรรม#
การแนะนำ#
อีเวนต์ช่วยให้คุณเรียกใช้ฟังก์ชันแบบอะซิงโครนัสได้ เมื่อมีการประกาศอีเวนต์ ฟังก์ชันเรียกกลับของอีเวนต์จะถูกเรียกใช้ในงาน (เธรด) ของตัวเอง ทำให้โค้ดหลักของคุณยังคงทำงานต่อไปได้ในเวลาเดียวกัน
สำคัญ: อ็อบเจ็กต์ event event จะเก็บ callback เพียงหนึ่งรายการเท่านั้น หากคุณลงทะเบียนฟังก์ชันอื่นด้วยอ็อบเจ็กต์ event เดียวกัน ฟังก์ชันใหม่จะ แทนที่ callback ก่อนหน้า
หากคุณต้องการให้หลายสิ่งเกิดขึ้นจากตัวกระตุ้นเดียว ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:
เรียกใช้ฟังก์ชันช่วยเหลือหลายฟังก์ชันจากฟังก์ชันเรียกกลับเดียว หรือ
ใช้ event object หลายตัวและกระจายแต่ละ event object นั้นออกไป
Use separate threads to run tasks independently.
ในการสร้างและใช้งานกิจกรรม ให้ทำตามขั้นตอนต่อไปนี้ตามลำดับ:
สร้างเหตุการณ์ด้วย
eventตั้งค่าฟังก์ชันเรียกกลับของเหตุการณ์ โดยใช้ชื่อเหตุการณ์ (เช่น:
myEvent(myCallback);)Broadcast an
event:broadcast— เรียกใช้ฟังก์ชันที่ลงทะเบียนทั้งหมดในวัตถุเหตุการณ์ให้ทำงานพร้อมกันbroadcastAndWait— เรียกใช้ฟังก์ชันที่ลงทะเบียนทั้งหมดในออบเจ็กต์เหตุการณ์และรอให้เสร็จสิ้นก่อนดำเนินการต่อ
ตัวสร้างคลาส#
1 — สร้างอ็อบเจ็กต์เหตุการณ์
eventโดยไม่มีฟังก์ชันเรียกกลับevent();
2 — สร้างอ็อบเจ็กต์เหตุการณ์
eventพร้อมฟังก์ชันเรียกกลับevent( void (* callback)(void) );
3 — Creates an
eventobject from another event with a callback function.event( event v, void (* callback)(void) );
4 — สร้างอ็อบเจ็กต์เหตุการณ์
eventพร้อมฟังก์ชันเรียกกลับที่รับอาร์กิวเมนต์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 );
ตัวทำลายคลาส#
ทำลายอ็อบเจ็กต์เหตุการณ์ event
~event();
พารามิเตอร์#
พารามิเตอร์ |
พิมพ์ |
คำอธิบาย |
|---|---|---|
|
|
ฟังก์ชันที่กำหนดไว้ล่วงหน้าเพื่อเรียกใช้เมื่อมีการออกอากาศเหตุการณ์ |
|
|
อ็อบเจ็กต์เหตุการณ์ที่มีอยู่แล้วเพื่อใช้คัดลอก |
|
|
ฟังก์ชันที่รับอาร์กิวเมนต์เป็นตัวชี้แบบ void และจะทำงานเมื่อมีการประกาศเหตุการณ์นั้น |
|
|
ตัวชี้ไปยังข้อมูลที่จะถูกส่งต่อไปยังฟังก์ชันเรียกกลับ (callback function) |
หมายเหตุ#
อ็อบเจ็กต์เหตุการณ์
eventจะเก็บ ฟังก์ชันเรียกกลับ (callback) เพียงหนึ่งฟังก์ชัน หากคุณลงทะเบียนฟังก์ชันอื่นกับอ็อบเจ็กต์เหตุการณ์เดียวกัน ฟังก์ชันนั้นจะ แทนที่ ฟังก์ชันเรียกกลับก่อนหน้าหากคุณต้องการให้หลายสิ่งเกิดขึ้นจากตัวกระตุ้นเดียว ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้:
เรียกใช้ฟังก์ชันช่วยเหลือหลายฟังก์ชันจากฟังก์ชันเรียกกลับเดียว หรือ
ใช้ event object หลายตัวและกระจายแต่ละ event object นั้นออกไป
ใช้เธรดแยกกันเพื่อรันงานต่างๆ อย่างอิสระ
ตัวอย่าง#
// 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— เรียกใช้ฟังก์ชัน callback ของเหตุการณ์เพื่อทำงานแบบขนานbroadcastAndWait— เรียกใช้ฟังก์ชัน callback ของเหตุการณ์และรอจนกว่าจะเสร็จสมบูรณ์
ก่อนเรียกใช้ฟังก์ชันสมาชิกเหตุการณ์ 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 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!");
}
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!");
}