Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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

جزء من قسم Logic & Flow في رحلة 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 يرسل القيم عبر قناة (channel) على فترات زمنية محددة. هذا مفيد للمهام التي تحتاج إلى التشغيل بشكل دوري:

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

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

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.Duration عن طريق الضرب في time.Second)
      • بعد التوقف، اعرض: "[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.Second لإنشاء قيمة المدة المناسبة. يوضح هذا التحدي كيفية استخدام time.Sleep لإنشاء فترات توقف زمنية في تنفيذ البرنامج للتطبيقات العملية مثل التأمل الموجه أو مؤقتات التمارين الرياضية.

ورقة مرجعية

استخدم time.Sleep لإيقاف تنفيذ البرنامج مؤقتًا لمدة محددة:

time.Sleep(2 * time.Second)

استخدم time.NewTicker للقيام بإجراءات على فترات منتظمة:

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

تستخدم كلتا الدالتين قيم time.Duration. قم بتحويل الأعداد الصحيحة إلى مدة زمنية عن طريق الضرب في time.Second.

جرّب بنفسك

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: اكتب الكود الخاص بك أدناه
	// تحليل كل خطوة لاستخراج التعليمات والمدة
	// تذكر التحقق مما إذا كانت شريحة الأجزاء تحتوي على عناصر كافية قبل الوصول إليها
	// عرض ترويسة الجلسة والإعداد
	// التكرار عبر الدورات والخطوات
	// استخدم time.Sleep للتوقف المؤقت (فكر في استخدام المللي ثانية للاختبار)
	// عرض رسائل الإكمال والملخص
	
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow