Εκδηλώσεις#

Εισαγωγή#

Τα συμβάντα σάς επιτρέπουν να ξεκινάτε μια συνάρτηση ασύγχρονα. Όταν μεταδίδεται ένα συμβάν, η συνάρτηση επανάκλησης του συμβάντος ξεκινά στη δική της εργασία (νήμα), επομένως ο κύριος κώδικά σας μπορεί να συνεχίσει να εκτελείται ταυτόχρονα.

Σημαντικό: Ένα αντικείμενο συμβάντος event αποθηκεύει μία επανάκληση. Εάν καταχωρήσετε μια άλλη συνάρτηση με το ίδιο αντικείμενο συμβάντος, αυτή αντικαθιστά την προηγούμενη επανάκληση.

Αν θέλετε να συμβούν πολλά πράγματα από μία ενεργοποίηση, είτε:

  • Κλήση πολλαπλών βοηθητικών συναρτήσεων από μία μόνο επανάκληση ή

  • Χρησιμοποιήστε πολλά αντικείμενα συμβάντος και μεταδώστε το καθένα.

  • Χρησιμοποιήστε ξεχωριστά threads για να εκτελέσετε εργασίες ανεξάρτητα.

Για να δημιουργήσετε και στη συνέχεια να χρησιμοποιήσετε ένα Συμβάν, ακολουθήστε τα παρακάτω βήματα με τη σειρά:

  1. Δημιουργήστε το συμβάν με event.

  2. Ορίστε την επανάκληση του συμβάντος χρησιμοποιώντας το όνομα του συμβάντος (π.χ.: myEvent(myCallback);).

  3. 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();

Παράμετροι#

Παράμετρος

Τύπος

Περιγραφή

callback

void (*)(void)

Μια συνάρτηση που έχει οριστεί εκ των προτέρων για εκτέλεση κατά τη μετάδοση του συμβάντος.

v

event

Ένα υπάρχον αντικείμενο συμβάντος από το οποίο θα αντιγραφεί.

callback

void (*)(void *)

Μια συνάρτηση που δέχεται ένα όρισμα δείκτη void και εκτελείται όταν μεταδίδεται το συμβάν.

arg

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 Functions
void operator()( void (* callback)() );

Parameters

Παράμετρος

Τύπος

Περιγραφή

callback

void (*)(void)

Μια προηγουμένως καθορισμένη συνάρτηση επανάκλησης που καλείται αυτόματα κατά την μετάδοση του συμβάντος. Η συνάρτηση πρέπει να ταιριάζει με την απαιτούμενη υπογραφή επανάκλησης. Ανατρέξτε στην ενότητα Συναρτήσεις επανάκλησης για περισσότερες πληροφορίες.

Return Values

Αυτή η συνάρτηση δεν επιστρέφει τιμή.

Notes
  • Η εκ νέου ρύθμιση μιας επανάκλησης αντικαθιστά την προηγούμενη επανάκληση.

  • Η συνάρτηση επανάκλησης δεν πρέπει να έχει παραμέτρους και να επιστρέφει void.

Examples

Ορίστε τις συναρτήσεις επανάκλησης (εκτός από 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 ξεκινά την επανάκληση του συμβάντος και συνεχίζει αμέσως.

Member Functions
void broadcast();

Parameters

Αυτή η συνάρτηση δεν δέχεται καμία παράμετρο.

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 Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Παράμετρος

Τύπος

Περιγραφή

timeout

int32_t

Ο αριθμός των χιλιοστών του δευτερολέπτου που θα περιμένουν πριν ξεκινήσει ξανά η εκτέλεση του κώδικα (προεπιλογή 60000).

Return Values

Αυτή η συνάρτηση δεν επιστρέφει τιμή.

Notes
  • Χρησιμοποιήστε αυτό μόνο με επανακλήσεις που τελειώνουν (όχι άπειροι βρόχοι).

  • Αυτή είναι μια συνάρτηση αναμονής που μπλοκάρει την εκτέλεση μέχρι να ολοκληρωθεί ή να λήξει το χρονικό όριο της επανάκλησης.

Examples

Ορίστε τη συνάρτηση επανάκλησης (εκτός από 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!");
}