Menu
CoddyTech
flag Ar iconالعربيةdown icon

الانتظار والـ Tickers

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 64 من 68.

أحيانًا تحتاج إلى التحكم في توقيت تنفيذ برنامجك. توفر Go دالتين أساسيتين في حزمة time لهذا الغرض: time.Sleep لإيقاف التنفيذ مؤقتًا، وtime.NewTicker لتنفيذ إجراءات على فترات منتظمة.

تُوقِف الدالة time.Sleep برنامجك مؤقتًا لمدة محددة. تأخذ قيمة time.Duration كوسيط لها، وتحظر التنفيذ حتى انقضاء تلك المدة:

fmt.Println("Starting...")
time.Sleep(2 * time.Second)
fmt.Println("Two seconds have passed!")

لتنفيذ الإجراءات المتكررة على فترات منتظمة، ينشئ time.NewTicker مؤقّتًا يرسل قيمًا عبر قناة على فواصل زمنية محددة. وهذا مفيد للمهام التي تحتاج إلى التنفيذ دوريًا:

ticker := time.NewTicker(1 * time.Second)
for i := 0; i < 3; i++ {
    <-ticker.C // انتظر النبضة التالية
    fmt.Println("Tick", i+1)
}

تُعدّ دوال التوقيت هذه ضرورية لإنشاء التأخيرات، وتنفيذ المهلات الزمنية، وجدولة العمليات المتكررة في برامج Go الخاصة بك.

challenge icon

التحدي

سهل

أنشئ مؤقّتًا لجلسة تأمل يستخدم time.Sleep لإنشاء فواصل بين التعليمات الإرشادية، ويوضح التحكم الأساسي في التوقيت في برامج Go.

ستتلقى مُدخلين:

  • سلسلة تحتوي على خطوات التأمل بالتنسيق "step1:duration,step2:duration,step3:duration" (مثلًا، "Breathe in:3,Hold:2,Breathe out:4")
  • سلسلة تحتوي على عدد الدورات المراد تكرارها (مثلًا، "5")

مهمتك هي:

  1. حلّل المُدخل الأول بتقسيمه عند الفواصل للحصول على خطوات التأمل الفردية
  2. لكل خطوة، قسّمها عند النقطتين الرأسيتين لاستخراج التعليمة والمدة (بالثواني)
  3. حوّل سلاسل المدة إلى أعداد صحيحة باستخدام الحزمة strconv
  4. حوّل المُدخل الثاني إلى عدد صحيح للحصول على عدد الدورات
  5. اعرض ترويسة الجلسة: "=== MEDITATION TIMER ==="
  6. اعرض إعداد الجلسة: "Starting meditation session with [number_of_cycles] cycles"
  7. لكل دورة (بدءًا من الدورة 1):
    • اعرض: "--- Cycle [cycle_number] ---"
    • لكل خطوة تأمل:
      • اعرض: "[instruction]..."
      • استخدم time.Sleep للتوقف للمدة المحددة (اضرب المدة في time.Millisecond، كما في time.Duration(duration) * time.Millisecond، لكي تنتهي الاختبارات بسرعة؛ سيظل الإخراج يعرض الثواني)
      • بعد التوقف، اعرض: "[instruction] complete ([duration] seconds)"
    • بعد إكمال جميع الخطوات في الدورة، اعرض: "Cycle [cycle_number] finished"
  8. بعد اكتمال جميع الدورات، اعرض ملخص الجلسة:
    • "=== SESSION COMPLETE ==="
    • "Total cycles completed: [number_of_cycles]"
    • "Steps per cycle: [number_of_steps]"
    • "Total meditation time: [total_seconds] seconds" (مجموع مدد جميع الخطوات مضروبًا في عدد الدورات)
  9. اعرض رسالة الإكمال: "Meditation session finished - well done!"

استخدم الحزمة time لعمليات التوقف، والحزمة strings لتقسيم سلاسل المُدخلات، والحزمة strconv لتحويل السلاسل إلى أعداد صحيحة، والحزمة fmt للإخراج. تذكّر أن time.Sleep تستقبل وسيطًا من النوع time.Duration، لذا حوّل العدد الصحيح أولًا: time.Duration(duration) * time.Millisecond. سيستخدم المؤقّت الحقيقي time.Second، لكن التوقف لثوانٍ كاملة يؤدي إلى انتهاء مهلة الاختبارات. يوضح هذا التحدي كيفية استخدام time.Sleep لإنشاء فواصل زمنية أثناء تنفيذ البرنامج لتطبيقات عملية مثل التأمل الإرشادي أو مؤقّتات التمارين.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// اقرأ الإدخال باستخدام bufio.Scanner للتعامل مع المسافات بشكل صحيح
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	stepsInput := scanner.Text()
	
	scanner.Scan()
	cyclesInput := scanner.Text()
	
	// حلّل خطوات التأمل والدورات
	steps := strings.Split(stepsInput, ",")
	cycles, _ := strconv.Atoi(cyclesInput)
	
	// TODO: اكتب الكود الخاص بك أدناه
	// حلّل كل خطوة لاستخراج التعليمة والمدة
	// تذكّر التحقق من أن الشريحة parts تحتوي على عناصر كافية قبل الوصول إليها
	// اعرض ترويسة الجلسة وإعداداتها
	// كرّر المرور على الدورات والخطوات
	// استخدم time.Sleep لفترات التوقف المؤقت: time.Duration(duration) * time.Millisecond
	// اعرض رسائل الإكمال والملخص
	
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم Go عبر الإنترنت