Acara#
Perkenalan#
Event memungkinkan Anda untuk menjalankan fungsi secara asinkron. Ketika sebuah event disiarkan, fungsi callback event tersebut akan dijalankan dalam task (thread) tersendiri, sehingga kode utama Anda dapat terus berjalan secara bersamaan.
Penting: Objek event menyimpan satu callback. Jika Anda mendaftarkan fungsi lain dengan objek event yang sama, fungsi tersebut akan menggantikan callback sebelumnya.
Jika Anda ingin beberapa hal terjadi dari satu pemicu, Anda dapat memilih salah satu dari berikut ini:
Memanggil beberapa fungsi pembantu dari satu fungsi callback, atau
Gunakan beberapa objek peristiwa dan siarkan masing-masing objek tersebut.
Gunakan thread terpisah untuk menjalankan tugas secara independen.
Untuk membuat dan kemudian menggunakan sebuah Acara, ikuti langkah-langkah berikut secara berurutan:
Buat acara dengan
event.Atur callback acara menggunakan nama acara (contoh:
myEvent(myCallback);).Broadcast an
event:broadcast— Memicu semua fungsi terdaftar dalam objek peristiwa untuk berjalan secara paralel.broadcastAndWait— Memicu semua fungsi terdaftar dalam objek peristiwa dan menunggu hingga selesai sebelum melanjutkan.
Konstruktor Kelas#
1 — Membuat objek
eventtanpa fungsi callback.event();
2 — Membuat objek
eventdengan fungsi callback.event( void (* callback)(void) );
3 — Membuat objek
eventdari event lain dengan fungsi callback.event( event v, void (* callback)(void) );
4 — Membuat objek
eventdengan fungsi callback yang menerima argumen.event( void (* callback)(void *), void *arg );
5 — Membuat objek
eventdari event lain dengan fungsi callback yang menerima argumen.event( event v, void (* callback)(void *), void *arg );
Destruktor Kelas#
Menghancurkan objek event dan melepaskan sumber daya terkait.
~event();
Parameter#
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Sebuah fungsi yang telah didefinisikan sebelumnya untuk dieksekusi ketika peristiwa tersebut disiarkan. |
|
|
Objek event yang sudah ada untuk disalin. |
|
|
Sebuah fungsi yang menerima argumen pointer void dan dieksekusi ketika peristiwa tersebut disiarkan. |
|
|
Pointer ke data yang akan diteruskan ke fungsi callback. |
Catatan#
Objek
eventmenyimpan satu callback. Jika Anda mendaftarkan fungsi lain dengan objek event yang sama, fungsi tersebut akan menggantikan callback sebelumnya.Jika Anda ingin beberapa hal terjadi dari satu pemicu, Anda dapat memilih salah satu dari berikut ini:
Memanggil beberapa fungsi pembantu dari satu fungsi callback, atau
Gunakan beberapa objek peristiwa dan siarkan masing-masing objek tersebut.
Gunakan thread terpisah untuk menjalankan tugas secara independen.
Contoh#
// 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);
}
Fungsi Keanggotaan#
Kelas event mencakup fungsi anggota berikut:
operator— Menetapkan fungsi callback untuk event.broadcast— Memicu fungsi callback event untuk berjalan secara paralel.broadcastAndWait— Memicu fungsi callback event dan menunggu hingga selesai.
Sebelum memanggil fungsi anggota event apa pun, sebuah instance event harus dibuat, seperti yang ditunjukkan di bawah ini:
/* 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#
Menetapkan fungsi callback untuk event menggunakan operator panggilan fungsi.
Available Functionsvoid operator()( void (* callback)() );
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Fungsi callback yang telah didefinisikan sebelumnya yang dipanggil secara otomatis ketika peristiwa disiarkan. Fungsi tersebut harus sesuai dengan tanda tangan callback yang dibutuhkan. Lihat Fungsi Callback untuk informasi selengkapnya. |
Fungsi ini tidak mengembalikan nilai.
NotesMengatur fungsi callback lagi akan menggantikan fungsi callback sebelumnya.
Fungsi callback tidak boleh memiliki parameter dan mengembalikan nilai 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 memulai panggilan balik acara dan berlanjut segera.
void broadcast();
Fungsi ini tidak memerlukan parameter apa pun.
Return ValuesFungsi ini tidak mengembalikan nilai.
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#
Memulai fungsi callback dan menunggu hingga selesai (atau habis waktu).
Available Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Parameter |
Jenis |
Keterangan |
|---|---|---|
|
|
Jumlah milidetik yang harus ditunggu sebelum kode mulai dieksekusi lagi (nilai default adalah 60000). |
Fungsi ini tidak mengembalikan nilai.
NotesGunakan ini hanya dengan fungsi callback yang berakhir (bukan loop tak terbatas).
Ini adalah fungsi tunggu yang memblokir eksekusi hingga fungsi callback selesai atau habis waktu.
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!");
}