الفعاليات#
مقدمة#
تتيح لك الأحداث بدء تشغيل دالة بشكل غير متزامن. فعند بث حدث ما، يتم بدء تشغيل دالة رد الاتصال الخاصة بهذا الحدث في مهمة (خيط) منفصلة، بحيث يمكن لبرنامجك الرئيسي الاستمرار في العمل في نفس الوقت.
هام: يخزن كائن الحدث event دالة رد نداء واحدة. إذا قمت بتسجيل دالة أخرى باستخدام نفس كائن الحدث، فإنها تحل محل دالة رد النداء السابقة.
إذا كنت تريد حدوث عدة أشياء من خلال مُحفِّز واحد، فإما:
استدعاء عدة دوال مساعدة من دالة رد نداء واحدة، أو
استخدم كائنات أحداث متعددة وقم ببث كل منها.
استخدم الخيوط المنفصلة لتشغيل المهام بشكل مستقل.
لإنشاء حدث واستخدامه، اتبع الخطوات التالية بالترتيب:
أنشئ الحدث باستخدام
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();
حدود#
المعلمة |
يكتب |
وصف |
|---|---|---|
|
|
دالة تم تعريفها مسبقًا لتنفيذها عند بث الحدث. |
|
|
كائن حدث موجود للنسخ منه. |
|
|
دالة تقبل وسيط مؤشر فارغ وتُنفذ عند بث الحدث. |
|
|
مؤشر إلى البيانات التي سيتم تمريرها إلى دالة الاستدعاء. |
ملحوظات#
يخزن كائن الحدث
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!");
}