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