Timers

Timers #

// ကျွန်တော်တို့က Go code ကို အနာဂတ်မှာ တစ်ချိန်ချိန်မှာ သို့မဟုတ်
// သတ်မှတ်ထားတဲ့ အချိန်ကြားတွေမှာ ထပ်ခါထပ်ခါ run ချင်တာ မကြာခဏ ရှိတတ်ပါတယ်။
// Go ရဲ့ built-in _timer_ နဲ့ _ticker_ feature တွေက ဒီအလုပ်နှစ်ခုစလုံးကို
// လွယ်ကူစေပါတယ်။ ပထမဆုံး timer ကိုကြည့်ပြီး
// နောက်မှ [ticker](tickers) ကို ကြည့်ပါမယ်။

package main

import (
	"fmt"
	"time"
)

func main() {

	// Timer တွေက အနာဂတ်မှာ ဖြစ်မယ့် event တစ်ခုကို ကိုယ်စားပြုပါတယ်။
	// သင်က timer ကို ဘယ်လောက်ကြာကြာ စောင့်ချင်လဲဆိုတာ ပြောပြပြီး
	// အဲဒီအချိန်ရောက်ရင် အသိပေးမယ့် channel တစ်ခုကို ရပါတယ်။
	// ဒီ timer က 2 စက္ကန့် စောင့်ပါမယ်။
	timer1 := time.NewTimer(2 * time.Second)

	// `<-timer1.C` က timer ရဲ့ channel `C` ပေါ်မှာ block လုပ်ထားပြီး
	// timer fired ဖြစ်ကြောင်း ညွှန်ပြတဲ့ တန်ဖိုးတစ်ခု ပို့လာတဲ့အထိ စောင့်ပါတယ်။
	<-timer1.C
	fmt.Println("Timer 1 fired")

	// အကယ်၍ စောင့်ဆိုင်းချင်ရုံသက်သက်ဆိုရင် `time.Sleep` ကိုလည်း သုံးနိုင်ပါတယ်။
	// Timer သုံးတာရဲ့ အကျိုးကျေးဇူးတစ်ခုကတော့ timer မ fired ခင် cancel လုပ်လို့ရတာပါ။
	// အောက်မှာ ဥပမာတစ်ခု ပြထားပါတယ်။
	timer2 := time.NewTimer(time.Second)
	go func() {
		<-timer2.C
		fmt.Println("Timer 2 fired")
	}()
	stop2 := timer2.Stop()
	if stop2 {
		fmt.Println("Timer 2 stopped")
	}

	// `timer2` က တကယ်လို့ အလုပ်လုပ်မယ်ဆိုရင် လုပ်နိုင်အောင် လုံလောက်တဲ့အချိန်ပေးထားပါတယ်။
	// ဒါပေမယ့် တကယ်တမ်း ရပ်တန့်သွားပြီ (stop) ဆိုတာကိုပြတာပါ။
	time.Sleep(2 * time.Second)
}
// ပထမ timer က ပရိုဂရမ်စတင်ပြီး ~2 စက္ကန့်လောက်မှာ အလုပ်လုပ်ပါလိမ့်မယ်၊ 
// ဒါပေမယ့် ဒုတိယ timer ကတော့ အလုပ်လုပ်ဖို့ အခွင့်အရေးမရခင် 
// ရပ်တန့်သွားပါလိမ့်မယ်။
$ go run timers.go
Timer 1 fired
Timer 2 stopped