الفعاليات#

مقدمة#

تتيح لك الأحداث بدء تشغيل دالة بشكل غير متزامن. فعند بث حدث ما، يتم بدء تشغيل دالة رد الاتصال الخاصة بهذا الحدث في مهمة (خيط) منفصلة، ​​بحيث يمكن لبرنامجك الرئيسي الاستمرار في العمل في نفس الوقت.

هام: يخزن كائن الحدث event دالة رد نداء واحدة. إذا قمت بتسجيل دالة أخرى باستخدام نفس كائن الحدث، فإنها تحل محل دالة رد النداء السابقة.

إذا كنت تريد حدوث عدة أشياء من خلال مُحفِّز واحد، فإما:

  • استدعاء عدة دوال مساعدة من دالة رد نداء واحدة، أو

  • استخدم كائنات أحداث متعددة وقم ببث كل منها.

  • استخدم الخيوط المنفصلة لتشغيل المهام بشكل مستقل.

لإنشاء حدث واستخدامه، اتبع الخطوات التالية بالترتيب:

  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 *)

دالة تقبل وسيط مؤشر فارغ وتُنفذ عند بث الحدث.

arg

void *

مؤشر إلى البيانات التي سيتم تمريرها إلى دالة الاستدعاء.

ملحوظات#

  • يخزن كائن الحدث 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 Functions
void operator()( void (* callback)() );

Parameters

المعلمة

يكتب

وصف

callback

void (*)(void)

دالة رد نداء مُعرَّفة مسبقًا تُستدعى تلقائيًا عند بث الحدث. يجب أن تتطابق الدالة مع توقيع رد النداء المطلوب. راجع دوال رد النداء لمزيد من المعلومات.

Return Values

هذه الدالة لا تُرجع قيمة.

Notes
  • يؤدي تعيين دالة رد نداء مرة أخرى إلى استبدال دالة رد النداء السابقة.

  • يجب ألا تحتوي دالة الاستدعاء على أي معلمات وأن تُرجع قيمة فارغة (void).

Examples
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 عملية استدعاء الحدث ويستمر على الفور.

Member Functions
void broadcast();

Parameters

لا تأخذ هذه الدالة أي معلمات.

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

Parameters

المعلمة

يكتب

وصف

timeout

int32_t

مقدار المللي ثانية التي يجب الانتظار قبل أن يبدأ تنفيذ الكود مرة أخرى (القيمة الافتراضية هي 60000).

Return Values

هذه الدالة لا تُرجع قيمة.

Notes
  • استخدم هذا فقط مع عمليات الاستدعاء التي تنتهي (لا تستخدم الحلقات اللانهائية).

  • هذه دالة انتظار تمنع التنفيذ حتى يكتمل رد الاتصال أو تنتهي مهلته.

Examples
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!");
}