Εκδηλώσεις#
Εισαγωγή#
Τα συμβάντα σάς επιτρέπουν να ξεκινάτε μια συνάρτηση ασύγχρονα. Όταν μεταδίδεται ένα συμβάν, η συνάρτηση επανάκλησης του συμβάντος ξεκινά στη δική της εργασία (νήμα), επομένως ο κύριος κώδικά σας μπορεί να συνεχίσει να εκτελείται ταυτόχρονα.
Σημαντικό: Ένα αντικείμενο συμβάντος event αποθηκεύει μία επανάκληση. Εάν καταχωρήσετε μια άλλη συνάρτηση με το ίδιο αντικείμενο συμβάντος, αυτή αντικαθιστά την προηγούμενη επανάκληση.
Αν θέλετε να συμβούν πολλά πράγματα από μία ενεργοποίηση, είτε:
Κλήση πολλαπλών βοηθητικών συναρτήσεων από μία μόνο επανάκληση ή
Χρησιμοποιήστε πολλά αντικείμενα συμβάντος και μεταδώστε το καθένα.
Χρησιμοποιήστε ξεχωριστά threads για να εκτελέσετε εργασίες ανεξάρτητα.
Για να δημιουργήσετε και στη συνέχεια να χρησιμοποιήσετε ένα Συμβάν, ακολουθήστε τα παρακάτω βήματα με τη σειρά:
Δημιουργήστε το συμβάν με
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αποθηκεύει μία επανάκληση. Εάν καταχωρήσετε μια άλλη συνάρτηση με το ίδιο αντικείμενο συμβάντος, αυτή αντικαθιστά την προηγούμενη επανάκληση.Αν θέλετε να συμβούν πολλά πράγματα από μία ενεργοποίηση, είτε:
Κλήση πολλαπλών βοηθητικών συναρτήσεων από μία μόνο επανάκληση ή
Χρησιμοποιήστε πολλά αντικείμενα συμβάντος και μεταδώστε το καθένα.
Χρησιμοποιήστε ξεχωριστά νήματα για να εκτελέσετε εργασίες ανεξάρτητα.
Παράδειγμα#
// 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!");
}