جدولة الكود مفيدة في العديد من الحالات، مثل ضمان تنفيذ الكود بعد انتهاء إجراء أو دورة معينة، أو تأخير الكود لمدة زمنية محددة. يمكنك استخدام مكتبة task لتحسين جدولة المهام في روبلوكس لإدارة وجدولة الكود. يمكنك أيضًا استخدام مكتبة مشابهة تسمى coroutine لجدولة الكود التي تحتوي على بعض الوظائف الإضافية.
الطرق الشائعة
فيما يلي أكثر طرق task شيوعًا المستخدمة لجدولة الكود. يجب أن تستخدم طرق المهام بدلاً من طرق الجدولة القديمة، مثل wait()، لضمان تشغيل الكود الخاص بك بشكل مثالي.
يوضح الجدول التالي الطرق العالمية القديمة ذات الصلة وبدائلها المفضلة والأكثر تحسينًا:
| الطرق العالمية القديمة | طرق المهام | بدائل إضافية |
|---|---|---|
| wait() | task.wait() | RunService.Heartbeat |
| wait(n) | task.wait(n) | |
| spawn(f) | task.defer(f) | task.delay(0, f) |
| delay(n, f) | task.delay(n, f) | |
| spawn(function() f(uv1, ...) end) | task.defer(f, uv1, ...) | task.delay(0, f, uv1, ...) |
| delay(n, function() f(uv1, ...) end) | task.delay(n, f, uv1, ...) |
task.spawn()
task.spawn() تأخذ خيطًا أو دالة وتستأنفها على الفور عبر جدولة المحرك. يتم تمرير المعلمات الإضافية إلى الخيط أو الدالة التي يتم استئنافها.
نموذج الكود التالي هو مثال على كيفية استخدام task.spawn() عند استدعاء دالة قد تتوقف أثناء التكرار على مجموعة من الكائنات:
local function playerAdded(player)
print(player)
end
for _, player in Players:GetPlayers() do
task.spawn(playerAdded, player)
end
task.defer()
task.defer() تأخذ خيطًا أو دالة وتؤجلها حتى نهاية نقطة الاستئناف الحالية داخل الإطار الحالي. يتم تمرير المعلمات الإضافية إلى الخيط أو الدالة المستأنفة.
يجب أن تستخدم هذا عادةً عندما تريد سلوكًا مشابهًا لـ task.spawn() ولكن لا تهتم بأن يتم تشغيل الخيط على الفور. يوضح نموذج الكود التالي كيف أن بيان print() لـ "A" سيتم تأجيله حتى بعد تنفيذ بيان print() لـ "B":
task.defer(print, "A")print("B")--> B--> A
task.delay()
task.delay() تأخذ خيطًا أو دالة وتقوم بجدولتها للاستئناف بعد الوقت المحدد من انتهاء خطوة Heartbeat التالية. يستأنف الخيط مع معالجة الأخطاء المدمجة ودعم الميزات الأخرى في المحرك. يتم تمرير أي معلمات إضافية إلى الخيط أو الدالة المستأنفة.
نظرًا لأن الوقت الفعلي للتأخير قد يختلف، يوضح نموذج الكود التالي كيف يمكنك حسابه عن طريق تمرير الوقت الحالي كمعلمة:
task.delay(2, function(scheduledTime)
print(os.clock() - scheduledTime) --> 2.038702
end, os.clock())
ستؤدي فترة زمنية تبلغ صفر إلى استئناف الخيط أو الدالة في الخطوة التالية.
task.wait()
task.wait() توقف الخيط الحالي حتى تنقضي الفترة الزمنية المعطاة (بالثواني) ثم تستأنف الخيط في الخطوة التالية من Heartbeat.
قد يختلف وقت الوقوف الفعلي. يوضح نموذج الكود التالي كيف تعيد هذه الطريقة وقت الوقوف لراحة المستخدم:
نظرًا لأن الوقت الفعلي للتأخير قد يختلف، يوضح نموذج الكود التالي كيف يمكنك الحصول على الوقت الفعلي عن طريق تخزين قيمة الإرجاع للطريقة:
local elapsedTime = task.wait(2) -- انتظر 2 ثانيةprint(elapsedTime) --> 2.0792941
إذا لم يتم إعطاء فترة زمنية، فستكون الفترة الزمنية الافتراضية صفر، مما يعني أن الخيط سيتم استئنافه تلقائيًا في الخطوة التالية. وهذا يعني أن task.wait() تعادل في السلوك RunService.Heartbeat.