21 Ağustos 2012 Salı

C# ile Timer

Merhaba değerli Webkolog.net takipçileri, bugünkü yazımızda C# .NET Framework 4 ile Windows Forms uygulamalarımızda belirli aralıklarla kod çalıştırmamızı sağlayan Timer kontrolünü yakından inceleyeceğiz. Zamanlayıcılar, uygulamalarımızda zaman bazlı olayları yönetmek, periyodik güncellemeler yapmak veya belirli bir süre sonra bir eylemi tetiklemek için vazgeçilmez araçlardır. Gelin, Timer'ın temel özelliklerini, nasıl kullanıldığını ve dikkat etmemiz gereken noktaları birlikte keşfedelim.

Timer Kontrolü Nedir?

Timer, .NET Framework'te belirli bir zaman aralığı dolduğunda bir olayı (Tick olayı) tetikleyen bir bileşendir. Windows Forms uygulamalarında kullandığımız System.Windows.Forms.Timer sınıfı, görsel bir arayüze sahip değildir; daha çok arka planda çalışan ve UI thread'i üzerinde olayları tetikleyen bir bileşendir. Bu özelliği sayesinde, kullanıcı arayüzünü güncelleyen veya kısa süreli periyodik görevleri yerine getiren senaryolarda oldukça kullanışlıdır.

Önemli Not: .NET Framework'te farklı amaçlar için tasarlanmış başka Timer sınıfları da bulunmaktadır (örneğin, System.Timers.Timer ve System.Threading.Timer). Bu makalede, özellikle Windows Forms uygulamaları için tasarlanmış ve UI thread'i üzerinde çalışan System.Windows.Forms.Timer sınıfına odaklanacağız.

Timer Kontrolünün Temel Özellikleri ve Olayları

Timer bileşeni, zamanlama davranışını kontrol etmek için basit ama etkili özelliklere sahiptir:

  • Interval: Zamanlayıcının Tick olayını tetikleyeceği milisaniye cinsinden süreyi belirler. Örneğin, 1000 milisaniye (1 saniye) olarak ayarlandığında, Tick olayı her saniye tetiklenir.
  • Enabled: Zamanlayıcının etkin olup olmadığını belirler. Eğer true olarak ayarlanırsa zamanlayıcı başlar, false ise durur. Bu özelliği tasarımcıda veya kod içinde ayarlayabilirsiniz.
  • Tick: Interval süresi her dolduğunda tetiklenen olaydır. Zamanlayıcının periyodik olarak yapmasını istediğimiz tüm kodlar bu olay işleyicisinin içine yazılır.

Timer Kullanım Senaryoları

1. Basit Bir Sayaç Oluşturma

Bu örnekte, bir Label kontrolünde her saniye artan bir sayaç görüntüleyeceğiz.

using System;
using System.Windows.Forms; // Timer, Label için

public partial class Form1 : Form
{
    private Timer timer1; // Tasarımcıda eklenen Timer bileşeni
    private Label labelSayac; // Tasarımcıda eklenen Label bileşeni
    private int sayacDegeri = 0;

    public Form1()
    {
        InitializeComponent();

        // Tasarımcıda timer1 ve labelSayac'ın eklenmiş olduğunu varsayalım.
        // labelSayac'ın Text özelliğini başlangıçta "0" olarak ayarlayalım.

        // Timer'ın Interval özelliğini 1 saniye (1000 milisaniye) olarak ayarla
        this.timer1.Interval = 1000;

        // Timer'ın Tick olayını bağla
        this.timer1.Tick += new EventHandler(timer1_Tick);
    }

    // Form yüklendiğinde zamanlayıcıyı başlat
    private void Form1_Load(object sender, EventArgs e)
    {
        this.timer1.Start(); // Zamanlayıcıyı etkinleştir
    }

    // Timer'ın Tick olayı işleyicisi
    private void timer1_Tick(object sender, EventArgs e)
    {
        sayacDegeri++; // Sayacı bir artır
        this.labelSayac.Text = sayacDegeri.ToString(); // Label'ı güncelle
    }
}
2. Zamanlayıcıyı Başlatma ve Durdurma

Bir buton tıklamasıyla zamanlayıcıyı başlatıp durdurabiliriz.

using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private Timer timer1;
    private Label labelDurum; // Durumu gösterecek Label
    private Button buttonBaslat; // Başlat butonu
    private Button buttonDurdur; // Durdur butonu

    public Form1()
    {
        InitializeComponent();
        timer1 = new Timer(); // Kod ile de oluşturulabilir
        timer1.Interval = 500; // Yarım saniye
        timer1.Tick += new EventHandler(timer1_Tick);

        // Tasarımcıda labelDurum, buttonBaslat, buttonDurdur eklenmiş olsun
        this.labelDurum.Text = "Zamanlayıcı Durdu";
        this.buttonBaslat.Text = "Başlat";
        this.buttonDurdur.Text = "Durdur";

        this.buttonBaslat.Click += new EventHandler(buttonBaslat_Click);
        this.buttonDurdur.Click += new EventHandler(buttonDurdur_Click);
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Her yarım saniyede bir mesajı güncelle
        this.labelDurum.Text = "Zamanlayıcı Çalışıyor: " + DateTime.Now.ToLongTimeString();
    }

    private void buttonBaslat_Click(object sender, EventArgs e)
    {
        if (!this.timer1.Enabled) // Eğer zamanlayıcı duruyorsa
        {
            this.timer1.Start(); // Zamanlayıcıyı başlat
            this.labelDurum.Text = "Zamanlayıcı Başladı";
        }
    }

    private void buttonDurdur_Click(object sender, EventArgs e)
    {
        if (this.timer1.Enabled) // Eğer zamanlayıcı çalışıyorsa
        {
            this.timer1.Stop(); // Zamanlayıcıyı durdur
            this.labelDurum.Text = "Zamanlayıcı Durdu";
        }
    }
}
3. Tek Seferlik Gecikme

Timer'ı tek seferlik bir gecikme sağlamak için de kullanabiliriz. Bunun için Tick olayı tetiklendikten sonra zamanlayıcıyı durdururuz.

using System;
using System.Windows.Forms;

public partial class Form1 : Form
{
    private Timer tekSeferlikTimer;

    public Form1()
    {
        InitializeComponent();
        // Tasarımcıda bir buton (buttonTekSeferlik) eklenmiş olsun

        tekSeferlikTimer = new Timer();
        tekSeferlikTimer.Interval = 3000; // 3 saniye sonra tetiklenecek
        tekSeferlikTimer.Tick += new EventHandler(tekSeferlikTimer_Tick);
        tekSeferlikTimer.Enabled = false; // Başlangıçta devre dışı

        this.buttonTekSeferlik.Click += new EventHandler(buttonTekSeferlik_Click);
    }

    private void buttonTekSeferlik_Click(object sender, EventArgs e)
    {
        MessageBox.Show("3 saniye sonra bir mesaj göreceksiniz...");
        tekSeferlikTimer.Start(); // Zamanlayıcıyı başlat
    }

    private void tekSeferlikTimer_Tick(object sender, EventArgs e)
    {
        tekSeferlikTimer.Stop(); // Zamanlayıcıyı durdur (tek seferlik olması için)
        MessageBox.Show("Gecikmeli mesajınız geldi!");
    }
}

Dikkat Edilmesi Gerekenler

  • UI Thread Üzerinde Çalışma: System.Windows.Forms.Timer, uygulamanızın ana kullanıcı arayüzü (UI) thread'i üzerinde çalışır. Bu, Tick olay işleyicisinin içinde uzun süren veya yoğun işlem gerektiren kodlar çalıştırırsanız, uygulamanızın kullanıcı arayüzünün donmasına (responsive olmamasına) neden olacağı anlamına gelir.
  • Uzun Süreli İşlemler İçin Alternatifler: Eğer Tick olayında uzun süreli veya arka plan işlemleri yapmanız gerekiyorsa, System.Windows.Forms.Timer yerine System.Timers.Timer veya System.Threading.Timer gibi diğer Timer sınıflarını veya doğrudan threading (iş parçacığı) kullanmayı düşünmelisiniz. Bu sayede, uzun süren işlemler ayrı bir thread'de çalışır ve UI thread'i donmaz.
  • Hassasiyet: Timer'ın Interval özelliği, tam olarak belirtilen milisaniye sonra olayın tetikleneceğini garanti etmez. İşletim sisteminin ve diğer işlemlerin yoğunluğuna bağlı olarak küçük gecikmeler yaşanabilir. Çok yüksek hassasiyet gerektiren uygulamalar için farklı zamanlama mekanizmaları gerekebilir.
---

Evet sevgili Webkolog.net okurları, bu yazımızda C# .NET Framework 4 ile Timer kontrolünün temel özelliklerini, kullanım senaryolarını ve dikkat edilmesi gereken noktaları detaylı bir şekilde inceledik. Timer, Windows Forms uygulamalarınızda zaman bazlı olayları yönetmek ve periyodik görevleri otomatikleştirmek için basit ama etkili bir araçtır. Kullanıcı arayüzünü güncelleyen sayaçlardan, belirli aralıklarla veri kontrol eden mekanizmalara kadar birçok alanda kullanılabilir. Umarım bu rehber, C# .NET Framework 4 ile uygulamalar geliştirirken size yardımcı olur. Bir sonraki yazımda, C# dilinin diğer önemli yapı taşlarını keşfetmeye devam edeceğiz. Webkolog.net'i takipte kalın!

Hepinize zamanı verimli kullandığınız ve başarılı geliştirme süreçleri dilerim!

0 yorum:

Yorum Gönder