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ự:
Tạo sự kiện với
event.Đặ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);).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
eventmà không có hàm gọi lại.event();
2 — Tạo một đối tượng
eventvới một hàm gọi lại.event( void (* callback)(void) );
3 — Creates an
eventobject from another event with a callback function.event( event v, void (* callback)(void) );
4 — Tạo một đối tượng
eventvớ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
eventkhá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ả |
|---|---|---|
|
|
Một hàm được định nghĩa trước để thực thi khi sự kiện được phát đi. |
|
|
Một đối tượng sự kiện hiện có để sao chép. |
|
|
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. |
|
|
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
eventthay 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 Functionsvoid operator()( void (* callback)() );
Tham số |
Kiểu |
Sự miêu tả |
|---|---|---|
|
|
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. |
Hàm này không trả về giá trị nào.
NotesViệ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.
Đị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.
void broadcast();
Hàm này không nhận tham số nào.
Return ValuesHàm này không trả về giá trị nào.
ExamplesXá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 Functionsvoid broadcastAndWait( int32_t timeout = 60000 );
Tham số |
Kiểu |
Sự miêu tả |
|---|---|---|
|
|
Số mili giây chờ trước khi mã bắt đầu thực thi lại (mặc định là 60000). |
Hàm này không trả về giá trị nào.
NotesChỉ 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ờ.
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!"); }