Timer Kullanımı

Timer zamanlayıcı olarak kullanılan .NET komponentidir. Programlamada zamanlama ölçümü gerektiren her durumda kullanılabilmektedir. Örnek olarak bir oyunda zaman ölçmede, bir veri girişi yapılması istendiğinde, bankaların mobil uygulamalarındaki SMS şifrelerinin ilgili textboxa girilmesi için zamanı ölçmek gibi bir çok alanda timer kullanılabilir.

Şimdi bu komponenti kullanarak birkaç örnek yapalım.

Visual Studio’da timer komponentini seçtiğimizde diğer komponentlerin çoğuna nazaran az özellik yer alır. Bunların içinde Timer için aktiflik özelliğinin kontrol edildiği Enabled özelliği en çok kullanılan özelliklerinden birisidir.

Diğer özellik ise Interval özelliğidir. Interval aralık demektir. Burada yer alan değer milisaniye cinsindendir. 100 değeri 1 saniyenin, onda biri kadar bir süreye denk düşer. 1000 değeri ise tam olarak 1 saniye demektir.

Şöyle bir örnek yapalım. Formuma bir adet buton, 1 adet label, 1 adette Timer ekliyorum. Aşağıdaki kodlarımı yazıyorum. Bu arada Timer interval özelliğimi de 1000 yaptım. Şimdi amacım butpna basıldığında 1000 milisaniyede bir olmak üzere labelda yazan değeri arttırmak. Kodlara geçelim;

Butonumun click eventinde;

timer1.Start(); // diyerek, timerı başlatıyorum.

Global alanda da label üzerinde yazdıracağım değeri tanımlıyor ve ilk halini atıyorum. Bunu neden global alanda yapıyorum, çünkü eğr ben bunu timer tick eventinde yaparsam her seferinde ilk değeri gösterir bana, bunun önüne geçmem gerek, dolayısı ile global alanda değişkenimi tanımlamadım.

int sayac = 0;

Daha sonra timerin Tick eventinde aşağıdaki kodları yazıyorum:

sayac++;
label1.Text = sayac.ToString();

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class TimerOrnek : Form
    {
        public TimerOrnek()
        {
            InitializeComponent();
        }

        int sayac = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            sayac++;
            label1.Text = sayac.ToString();
        }
    }
}

Buradaki sayma işlemim int tanımladığım için int değerin en son alabileceği rakama kadar gidecektir.

Peki başka bir örnekle pekiştirelim. Sayacım 100’e ulaştığında dursun istiyorum ve bu sefer her 100 milisaniyede artış olsun. Bunun için timerın Stop metodunu kullanacağım. Aynı şekilde formumda bir buton, bir label ve bir timer var. Yine sayaç değişkenimi global alanda tanımlıyorum.

Tüm kodlarım aşağıdaki şekilde;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class TimerOrnek : Form
    {
        public TimerOrnek()
        {
            InitializeComponent();
        }
        //Değişkenimi global alanda tanımladım.
        int sayac = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            //Butona basıldığında timer başlatılıyor.
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Her 100 milisaniyede sayaç 1 artıyor ve labela yazdırıyorum.
            sayac++;
            label1.Text = sayac.ToString();
            //sayac değerim 100 olunca timer durduruluyor.
            if (sayac == 100)
            {
                timer1.Stop();
            }
        }
    }
}

Burada sayaç saydıktan sonra formun arka plan rengi değişsin. Buna ilişkin ilgili kodları ekleyelim.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class TimerOrnek : Form
    {
        public TimerOrnek()
        {
            InitializeComponent();
        }
        //Değişkenimi global alanda tanımladım.
        int sayac = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            //Butona basıldığında timer başlatılıyor.
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Her 100 milisaniyede sayaç 1 artıyor ve labela yazdırıyorum.
            sayac++;
            label1.Text = sayac.ToString();
            //sayac değerim 100 olunca timer durduruluyor.
            if (sayac == 100)
            {
                timer1.Stop();
                this.BackColor = Color.Aqua;
            }
        }
    }
}

Hadi GS için bir de formu geçişli yapalım 😊

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class TimerOrnek : Form
    {
        public TimerOrnek()
        {
            InitializeComponent();
        }
        //Değişkenimi global alanda tanımladım.
        int sayac = 0;
        private void button1_Click(object sender, EventArgs e)
        {
            //Butona basıldığında timer başlatılıyor.
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Her 100 milisaniyede sayaç 1 artıyor ve labela yazdırıyorum.
            sayac++;
            label1.Text = sayac.ToString();
            
            //sayacımın değerine göre önce form arka plan rengi sarı, sonra kırmızı oluyor. Kırmızı olduktan sonra sayacımı sıfırlıyorum.  
            if (sayac == 1)
            {
                this.BackColor = Color.Yellow;
            }
            if (sayac == 5)
            {
                this.BackColor = Color.Red;
                sayac = 0;
            }
        }
    }
}

Trafik Işık Similasyonu

Birde şöyle bir örnek yapalım. Bir trafik ışıkları similasyonu gibi basit bir örnek olsun. Formuma 3 tane buton ekleyeceğim ve bir timer ekleyeceğim. Butonlarım form yüklendiğinde arka plan renkleri siyah olacak, ama form yüklenir yüklenmez ilk butonumda kırmızı arka plan rengi olacak. Bu 10 sn böyle olacak. Sonrasında ikinci buton 3 saniye sarı olacak. İlk buton siyah olacak. Son buton ise siyah olacak.

14. Saniyede bu sefer en son buton yeşil olacak. İlk ikisi siyah olacak. 23. Saniye sonunda tekrar başa dönecek. Bununla alakalı kodlarımı yazıyorum. Formumda yer alan Timer Interval özelliğimi 1000 milisaniye yapıyorum. Kodlarım şöyle;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class Form11 : Form
    {
        public Form11()
        {
            InitializeComponent();
        }

        //Global olarak sayaç için değişken tanımlaması yaptım.
        int sayac = 1;

        //form yüklendiğinde timerı başlatıyorum. İlk anda ilk buton kırmızı, diğerleri siyah.
        private void Form11_Load(object sender, EventArgs e)
        {
            timer1.Start();
            btnKirmizi.BackColor = Color.Red;
            btnSari.BackColor = Color.Black;
            btnYesil.BackColor = Color.Black;

            
        }

        //Form yüklenmesi ile birlikte timer başlatıldı. 
        private void timer1_Tick(object sender, EventArgs e)
        {
            //Her bir tickde sayaç değerim artıyor. Tick ayarı 1000 milisaniye yaptım.
            sayac++;

            //ilk 10 saniye için buton renklerim
            if (sayac <= 10)
            {
                btnKirmizi.BackColor = Color.Red;
                btnSari.BackColor = Color.Black;
                btnYesil.BackColor = Color.Black;
                                
            }

            //11,12 ve 13. saniyede buton renklerim.
            else if (sayac >= 11 && sayac <= 13)
            {
                btnSari.BackColor = Color.Yellow;
                btnKirmizi.BackColor = Color.Black;
                btnYesil.BackColor = Color.Black;
            }

            //14. saniye ile 23. saniye arasında buton renklerim
            else if (sayac >= 14 && sayac <= 23)
            {
                btnYesil.BackColor = Color.Green;
                btnKirmizi.BackColor = Color.Black;
                btnSari.BackColor = Color.Black;                
            }
            //24. saniyede sayacı başa sardım.
            else if (sayac >= 24)
            {
                sayac = 1;
            }
        }
    }
}
Timer ile basit saat yapımı

Son olarak da basit saat örneği ile Timer konumuzu kapatalım. Bur örneğimde formuma 3 adet label ekliyorum. 1 adette timer ekliyorum. Labellerin isimleri şöyle; lblSaniye, lblDakika, lblSaat.

ilk başta global alanda değişkenlerimi tanımlıyorum bana 3 adet değişken lazım. saniye, dakika ve saat değişkenlerim int olacak şekilde tanımlıyorum.

Akabinde form yüklendiğinde timer.start diyerek timeriın saymasını sağlıyorum. Bu arada timer komponentinin Interval özelliğini de 1000 milisaniye yaptım ki, gerçek bir saat gibi davranabilsin.

Form yüklendiğinde timer saymaya başlıyor. Bunun için saniye değerini 1 arttırıyorum ve her bir artımda lblSaniye labelina yazdırıyorum. Saniye değerim 60 olduğunda artık dakika değerime +1 ekliyorum. Burada 60 rakamını görmemek için de lblSaniye labelina sıfır ataması yapıyorum. Daha sonra diğer if kararı ile dakikanın kontrolünü yapıyorum. Yine orada da 60. dk olduğunda saat değişkenimi 1 arttırıyorum. Burada da yine dakika alanımda 60 görmemek için lblDakika labelini sıfırlıyorum.

Saat alanımda da maksimum 24’e ulaştığında saat lblSaat labelina 0 ataması yapıyorum.

Basit bir saat uygulaması yapmış olduk. Burada tabi her bir saniye de zaman değişiyor kodlar doğru mu kontrol etmek için timerın intervalini daha küçük milisaniye değerleri seçebilirsiniz. 1 milisaniye yapıp örnekleyebilirsiniz. Olay kodlardan da görüleceği üzere iç içe if yapısı ile çözülebilmekte.

Tüm kodları paylaşarak bu yazıyı da bitirmiş olalım 🙂

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace KararYapilariOrnekler
{
    public partial class TimerDijitalSaat : Form
    {
        public TimerDijitalSaat()
        {
            InitializeComponent();
        }

        //değişkenlerimi global olarak tanımladım. 
        int saniye = 0, dakika = 0, saat = 0;
        //form yüklendiğinde timer saymaya başlıyor
        private void TimerDijitalSaat_Load(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Timerın her bir tickinde saniye değerim 1 artıyor ve ilgili labela değeri yazdırıyorum.
            saniye++;
            lblSaniye.Text = saniye.ToString();

            //Eğer saniyem 60 olursa, dakika değerini 1 arttır ve ilgili labela yazdır. Saniyede 60 rakamını görmemek için de saniye labelina 0 ataması yaptım.
            if (saniye == 60)
            {
                dakika++;
                lblSaniye.Text = "0";
                lblDakika.Text = dakika.ToString();
                saniye = 0;

                //Eğer dakikam 60 olursa, saat değerini 1 arttır ve ilgili labela yazdır. Dakikada 60 rakamını görmemek için de dakika labelina 0 ataması yaptım.
                if (dakika == 60)
                {
                    saat++;
                    lblDakika.Text = "0";
                    lblSaat.Text = saat.ToString();
                    dakika = 0;

                    ////Eğer saatim 24 olursa, saatte 24 rakamını görmemek için de saat labelina 0 ataması yaptım.
                    if (saat == 24)
                    {
                        lblSaat.Text = "0";
                    }
                }

            }

        }
    }
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir