Sự kiện#

Giới thiệu#

Sự kiện cho phép bạn khởi chạy một hàm bất đồng bộ. Khi một sự kiện được phát đi, hàm gọi lại của sự kiện đó sẽ được khởi chạy trong một tác vụ (luồng) riêng, do đó mã chính của bạn có thể tiếp tục chạy cùng lúc.

Important: An event object stores one callback. If you register another function with the same event object, it replaces the previous callback.

Nếu bạn muốn nhiều sự kiện xảy ra từ một tác nhân kích hoạt duy nhất, hãy làm theo một trong hai cách sau:

  • Gọi nhiều hàm hỗ trợ từ một hàm gọi lại duy nhất, hoặc

  • Sử dụng nhiều đối tượng sự kiện và phát sóng từng đối tượng một.

  • Sử dụng các luồng riêng biệt để chạy các tác vụ một cách độc lập.

Để tạo và sử dụng Sự kiện, hãy làm theo các bước sau theo đúng thứ tự:

  1. Tạo sự kiện với event.

  2. Đặt hàm gọi lại của sự kiện bằng cách sử dụng tên sự kiện (ví dụ: myEvent(myCallback);).

  3. Broadcast an event:

    • broadcast — Kích hoạt tất cả các chức năng đã đăng ký trong một đối tượng sự kiện để chạy song song.

    • broadcastAndWait — Kích hoạt tất cả các hàm đã đăng ký trong một đối tượng sự kiện và chờ chúng hoàn thành trước khi tiếp tục.

Hàm tạo lớp#

1 — Tạo một đối tượng event mà không có hàm gọi lại.

event();

2 — Tạo một đối tượng event với một hàm gọi lại.

event( void (* callback)(void) );

3 — Creates an event object from another event with a callback function.

event( 
  event v, 
  void (* callback)(void) );

4 — Tạo một đối tượng event với một hàm gọi lại chấp nhận một đối số.

event( void (* callback)(void *), void *arg );

5 — Tạo một đối tượng sự kiện event khác bằng một hàm gọi lại chấp nhận một đối số.

event( event v, void (* callback)(void *), void *arg );

Lớp Destructor#

Hủy đối tượng sự kiện event và giải phóng các tài nguyên liên quan.

~event();

Thông số#

Tham số

Kiểu

Sự miêu tả

callback

void (*)(void)

Một hàm được định nghĩa trước để thực thi khi sự kiện được phát đi.

v

event

Một đối tượng sự kiện hiện có để sao chép.

callback

void (*)(void *)

Một hàm nhận đối số là con trỏ void và được thực thi khi sự kiện được phát đi.

arg

void *

Con trỏ trỏ đến dữ liệu sẽ được truyền cho hàm gọi lại.

Ghi chú#

  • Một đối tượng sự kiện event thay thế hàm gọi lại trước đó.

  • Nếu bạn muốn nhiều sự kiện xảy ra từ một tác nhân kích hoạt duy nhất, hãy làm theo một trong hai cách sau:

    • Gọi nhiều hàm hỗ trợ từ một hàm gọi lại duy nhất, hoặc

    • Sử dụng nhiều đối tượng sự kiện và phát sóng từng đối tượng một.

    • Sử dụng các luồng riêng biệt để chạy các tác vụ một cách độc lập.

Ví dụ#

Xác định hàm gọi lại (bên ngoài int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.print("Callback function executed!");
}

Đăng ký hàm gọi lại bên trong 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);
}

Chức năng thành viên#

Lớp sự kiện event bao gồm các hàm thành viên sau:

  • operator — Đặt hàm gọi lại cho sự kiện.

  • broadcast — Kích hoạt hàm gọi lại của sự kiện để chạy song song.

  • broadcastAndWait — Kích hoạt hàm gọi lại của sự kiện và chờ hoàn thành.

Trước khi gọi bất kỳ hàm thành viên nào của sự kiện event , cần phải tạo một thể hiện của sự kiện event , như được hiển thị bên dưới:

/* 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#

Thiết lập hàm gọi lại cho sự kiện bằng cách sử dụng toán tử gọi hàm.

Available Functions
void operator()( void (* callback)() );

Parameters

Tham số

Kiểu

Sự miêu tả

callback

void (*)(void)

Một hàm gọi lại được định nghĩa trước đó được gọi tự động khi sự kiện được phát sóng. Hàm phải khớp với chữ ký gọi lại yêu cầu. Xem Hàm gọi lại để biết thêm thông tin.

Return Values

Hàm này không trả về giá trị nào.

Notes
  • Việc thiết lập lại hàm gọi lại sẽ thay thế hàm gọi lại trước đó.

  • Hàm gọi lại phải không có tham số và trả về kiểu void.

Examples

Định nghĩa các hàm gọi lại (bên ngoài 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);
}

Đăng ký hàm gọi lại bên trong 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#

Lệnh broadcast bắt đầu hàm gọi lại của sự kiện và tiếp tục ngay lập tức.

Member Functions
void broadcast();

Parameters

Hàm này không nhận tham số nào.

Return Values

Hàm này không trả về giá trị nào.

Examples

Xác định hàm gọi lại (bên ngoài int main())

// Create a callback function
void onMyEvent() {
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
  Brain.Screen.print("Event fired!");
}

Đăng ký hàm gọi lại bên trong 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#

Khởi tạo hàm gọi lại và chờ cho đến khi nó hoàn tất (hoặc hết thời gian).

Available Functions
void broadcastAndWait( int32_t timeout = 60000 );

Parameters

Tham số

Kiểu

Sự miêu tả

timeout

int32_t

Số mili giây chờ trước khi mã bắt đầu thực thi lại (mặc định là 60000).

Return Values

Hàm này không trả về giá trị nào.

Notes
  • Chỉ sử dụng điều này với các hàm gọi lại có kết thúc (không phải vòng lặp vô hạn).

  • Đây là một hàm chờ, ngăn chặn quá trình thực thi cho đến khi hàm gọi lại hoàn tất hoặc hết thời gian chờ.

Examples

Xác định hàm gọi lại (bên ngoài int main())

// Create a callback function
void startDriving() {
  Drivetrain.drive(forward);
  wait(2, seconds);
}

Đăng ký hàm gọi lại bên trong 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!");
}