الدرس 6 من 10

مجدول الكوروتينات

هدف الدرس

الإيقاف بـ yield والمتابعة بـ resume

01

الشرح

المشهد في اللعبة خطوات بينها انتظار، فالحارس يتكلّم، وبعد ثانيتين يتكلّم مرّة أخرى، ثم يُفتح الباب. وإن كتبته بالمؤقّتات تقطّع إلى دوال متفرّقة ومتغيّرات تحفظ «أين وصلنا». أمّا الكوروتين (coroutine) فدالة تتوقّف في منتصفها بـcoroutine.yield ثم تُكمل لاحقًا من السطر نفسه بـcoroutine.resume، فتكتب المشهد من أعلى إلى أسفل كما يُقرأ.

ويحتاج الكوروتين إلى من يوقظه، وهذا عمل المجدول (scheduler)، فهو يحفظ لكل مهمّة متى تستيقظ، ويستأنف في كل إطار المهامّ التي حان وقتها، ويحذف كل مهمّة صارت حالتها "dead" في coroutine.status. وعلى هذه الفكرة تقوم Citizen.Wait في FiveM وtask.wait في Roblox.

وانتبه إلى أن coroutine.resume لا ترمي الخطأ الذي يقع داخل الكوروتين، بل تُرجع false ومعها رسالة الخطأ، فإن تجاهلت القيمة الأولى رأيت المشهد يتوقّف في منتصفه دون أي رسالة، ولن تعرف أين تبحث.

02

المطلوب

أكمل wait(seconds) لتعطي المجدول مدّة التوقّف عن طريق coroutine.yield، وScheduler:spawn(fn) لتضيف إلى tasks مهمّة تبدأ مع أول update لا قبله، وScheduler:update(now) لتستأنف كل مهمّة حان وقتها، وتحفظ متى تستيقظ، وتحذف المهامّ المنتهية. وإن رمت مهمّة خطأً فاطبع رسالته بـprint واحذف المهمّة، ودع المهامّ الأخرى تُكمل.

الفحوص

6 فحوص
  1. المهمّة تبدأ مع أول update لا قبله
  2. الدالة wait توقف المهمّة حتى يحين وقتها
  3. المهمّة المنتهية تُحذف
  4. كل مهمّة تتقدّم في وقتها
  5. خطأ مهمّة لا يوقف المهامّ الأخرى
  6. رسالة الخطأ تُطبع ولا تختفي
03

تلميحات

0/3
main.lua
المخرجاتLua 5.4 (wasmoon)

نحمّل بيئة Lua الآن.

–/6

يبدأ الفحص حين تجهز البيئة.

تجد 6 فحوص في بطاقة «المطلوب».