ÜYE GİRİŞİ  
Kullanıcı adı :
Parola :
 
  Üye Ol!  
 
 
ANASAYFA HABERLER ASP ASP.NET PHP C/C++ C# JAVA ARAMA İLETİŞİM

ASP.NET
  Expression Web ile Site Yapimi
  Web Server Control Yazmak - 2
  Web Server Control Yazmak - 1
  Sql Cache Dependency
  Web Kontrollerini Etkin Kullanmak
  Xslt Kullanımı
  Bir Web Sayfasının Anatomisi
  Client Script Callback
  Login Kontrollerinin Kullanımı

ASP
  ASP Nesneleri
  29 Soruda ASP
  Matematiksel Uygulamalar
  Select Case Yapısı 2
  Fonksiyon(Function) Kullanımı
  IF-ELSE...
  GET Yöntemi ile İşlemler
  Asp de Tarih ve Saat fonksiyonları
  While-wend döngüsü

C Sharp (C#)
  C#'da klasör işlemleri
  C# ile diziyi tersine çevirme
  Çok Kullanılan Kontroller-1
  C# ile Kronometre Uygulaması
  Overloaded Metotların Gücü
  C# ile XMLQuery Örneği
  Rastgele Kod Üretimi
  Kontroller ile Çalışma
  Düzenli İfadeler Nedir?

DUYURULAR

F# Microsoft dil teknolojisinin en yeni üyesi.Common Lisp-Slime-Emacs tarzında etkileşimli,kıvrak,sonuçların anında görülebildiği ve yüksek performanslı bir betik dil olarak özetleyebiliriz bu yeni dili. devamı >>


Türk Telekom'dan yapılan yazılı açıklamada, Telekomünikasyon Kurumu'nun onayladığı yeni tariflerin, internet servis sağlayıcı şirketlerin maliyetlerini önemli oranlarda düşüreceği aktarıldı. devamı >>


C# ile Zamanlayıcı Kullanmak (System.Timers) | Asundinay.Com
C Sharp (C#) İçin Eklenmiş Makale
 Makale Adı  :  C# ile Zamanlayıcı Kullanmak (System.Timers)
 Yayın Tarihi :  12.08.2007 14:15:03 Ekleyen :  Kazım Aydın Okunma : 267

Windows programlama ile uğraşanlar Timer kontrolünü sık sık kullanmışlardır. Bu yazıda System.Timers isim alanında bulunan Timer sınıfı ile bir programdaki rutin olarak yapılması gereken işleri belirli bir zaman aralığı içinde ne şekilde yapabileceğimizi öğreneceğiz. Ancak alışalıgelmiş şekilde bir grafik arayüzü olan program yerine uygulamamızı komut satırından çalışacak şekilde geliştireceğiz. Burdaki amacımız zamanlayıcı dediğimiz timer nesnelerinin çalışma prensibini yakından görmektir.

Şöyle bir konsol uygulaması yapmanız gerektiğini düşünün. Her 5 dakikada bir, belirli bir kaynaktaki değişiklikler kontrol edilecek. Eğer kaynakta bir değişiklik varsa kullanıcıya uyarı verilecek. Bunu klasik yöntemlerle ne şekilde yapabilirdiniz bir düşünün? Yada ben söyliyeyim. Muhtemelen sonsuz bir döngü içerisinde sistem saatini kontrol edip belirli bir aralık geçmiş ise kaynağı kontrol eden işlevi çağıracaktınız. Eğer zamansal bir işlem yapıyorsak ki bir olayı bir zaman dilimi içinde sürekli gerçekleştirmek zamana bağlı bir olaydır; mutlaka sistem saatinden faydalanmamız gerekir. Sistem saatini makine düzeyinde işleyen bir birim olarak düşünebilirsiniz. Bilgisayar bilimlerinde bir çok algoritma sistem saati üzerine kurulmuştur. Zatan eğer zamanı ölçebilecek bir birim olmasaydı şu anki teknolojik imkanlara kavuşmamız mümkün olamazdı. Sonuç olarak zaman ne kadar değerliyse zamanı ölçebilmek te o derece önemlidir.

Bu yazıda bir metodu bir zaman dilimi içerisinde tekrar tekrar çağırmayı öğreneceğiz. Bunun için System.Timers isim alanında ki Timer isimli sınıfı kullanacağız. Timer sınıfında bulunan Elapsed olayı timer nesnesinin Interval özelliği ile belirlenen aralıkta çalıştırılacak metodun referansını tutmaktadır. Metodun referansı Timer sınıfının içindeki delegate(temsilci) ve olay(event) veri yapıları ile sağlanmaktadır. (Delegate ve Event veri yapıları ile ilgili ayrıntılı yazılar ileriki zamanlarda yayınlanacaktır.)

Şimdi isterseniz Timer sınıfının yapıcı metotlarını inceleyelim.Timer sınıfının iki tane yapıcı metodu vardır. Bu metotlardan birincisi herhangi bir parametre almamaktadır. İkincisi ise double türden bir parametre almaktadır. Double türden olan bu parametre Timer nesnesinin Elapsed olayının ne kadar sürede meydana geleceğini belirtmektedir. Bu metodun prototipi aşağıdaki gibidir.

public Timer(double TickSayısı)

TickSayisi milisaniye cinsindendir. örneğin her 1 saniyede çalışmasını istediğimiz bir metot için TickSayisi 1000 olan bir Timer kullanmamız gerekir. Saniyede on defa çalışmasını istediğimiz bir metot için ise TickSayisi 100 olan bir Timer nesnesi kullanmalıyız. Eğer yapıcı metot herhangi bir parametre ile kullanılmaz ise varsayılan TickSayisi olan 100 ile Timer nesnesi oluşturulur.

çalışma zamanında timer nesnelerinin TickSayisini değiştirmek yada Tick sayısını öğrenmek için Interval özelliği kullanılabilir. Timer nesneleri varsayılan olarak aktif değillerdir. Bu yüzden Timer nesnelerinin işleyebilmesi için bool türden olan Enabled özelliğinin true olarak ayarlanması gerekir. Yada Timer sınıfının Start() metodunu kullanarak zamanlayıcıyı başlatmanız gerekmektedir.

Timer sınıfı ile ilgili en önemli nokta Interval ile belirtilen süre dolduğunda hangi metodu çağıracağını nerden anlayacağıdır. Bunun için temsilciler ve olaylar kullanılır. Timer sınıfı tasarlanırken yapısında tanımlanan event ve delegate veri türleri ile bu mümkün olmaktadır. Timer sınıfının Elapsed olayı bu işe yaramaktadır. Elapsed olayına += operatörü ile olay yöneticisi yardımıyla(event handler) yeni metotlar ekleyebiliriz. Timer sınıfının Elapsed olayı için ElapsedEventHandler isminde özel bir temsilci tanımlanmıştır. Bu temsilci nesnesine parametre olarak verilecek metodun parametreik yapısı aşağıdaki gibi olmalıdır.

SaniyelikIs(object o, ElapsedEventArgs a)

ElapsedEventArgs sınıfı Timer nesnesi ile ilgili ayrıntılı bilgiler tutmaktadır. örneğin ElapsedEventArgs sınıfının SignalTime özelliği ile Elapsed olayının meydana geldiği saati ve tarihi öğrenebiliriz. örneğimizi verdikten sonra ElapsedEventArgs sınıfını daha iyi öğreneceksiniz.

Timer sınıfının diğer bir önemli elemanı ise Stop() metodudur. Bu metodu çağırdığımız anda Timer nesnesinin Elapsed olayı artık meydana gelmez. Stop() metodu yerine Timer nesnesnin Enabled özelliğini false yapmak ta diğer bir çözümdür.

Timer sınıfı ile ilgili bu bilgileri verikten sonra bir örnek ile bilgilerimizi pekiştirelim. örneğimiz de her saniye de saati ekrana yazadıracak bir metot bildireceğiz. Bu metot bir Timer sayesinde her saniye çağrılacaktır. örneğin kaynak kodu aşağıdaki gibidir.

using System;
using System.Timers;

class Zamanlayici
{
   static void Main()
   {
      Timer t = new Timer(1000);
      t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
      t.Start();

      while(true)
      {
      
      }
   }

   static void SaniyelikIs(object o, ElapsedEventArgs a)
   {
      Console.WriteLine(DateTime.Now);
   }
}

Timer sınıfının işlevini görebilmek için programımızın en az beş on saniye çalışmasına devam etmesi gerekir. Bunun için while(true) şeklinde sonsuz bir döngü kurduk. Eğer bu sonsuz döngü olmasaydı programın icrası bir saniyeden kısa bir sürede biteceği için Elapsed olayı meydana gelmeyecekti. Programın çalışması sırasında elde edilmiş bir ekran görüntüsü aşağıdaki gibidir.

Ekran çıktısından da görüldüğü üzere her saniyede ekrana yeni saat değeri yazıldığı için programımız bir saat gibi çalışmaktadır.

SaniyelikIs() metodunu ElapsedEventArgs sınıfından dolayı aşağıdaki gibi de yazabilirdik. ElapsedEventArgs sınıfının SignalTime özelliği Elapsed olayının meydana geldiği zamanı vermektedir.

static void SaniyelikIs(object o, ElapsedEventArgs a)
{
  Console.WriteLine(a.SignalTime);
}

Timer sınıfını kullanırken karşılaşabileceğimiz en büyük sorunlardan biri Elapsed olayının meydana gelme aralığının olaydan sonra çalıştırılacak kodların icrası için geçen zamandan az olmasında görülür. Bu sorun, ikinci Elapsed olayı meydana geldiğinde birinci Elapsed olayına ilişkin kodlar halen çalışıyor durumda olmasından kaynaklanır. örneğimizdeki Timer nesnesinin Tick sayısını 1000 yerine 100 yaptığımızda aynı saat değerinin 10 defa ekrana yazdırılması gerektiğini anlarız. çünkü Elapsed olayı her saniyede 10 defa gerçekleşecektir. Her 10 Elapsed olayı gerçekleştiğine bir saniye geçeceği için ekrana aynı saat değeri 10 defa yazmalıdır diye düşünürüz. Ama bunun gerçekte böyle olmadığını görürüz. Tick sayısını 100 yaptığımızda programın ekran çıktısı aşağıdaki gibi olmaktadır.


Ekran çıktısında bazı saat değerlerinin daha fazla sayıda bazılarının ise daha az sayıda yazıldığını görüyorsunuz. Bu demek oluyorki programın bellek durumuna ve işlemcinin yoğunluğuna göre Elapsed olayının meydana gelme sayısı değişmektedir. Bunu önlemenin yolu tick sayısının, Elapsed olayından sonra çalışacak metot yada metotların toplam icra süresinde daha fazla olacak şekilde ayarlamaktır.

Elapsed olayına birden fazla metotodu ilişkilendirebiliriz. örneğin Elapsed olayı her saniyede bir meydana geldiğinde ekrana ayrıca "Merhaba Elapsed olayı!" yazdırmak için aşağıdaki programı yazabilirsiniz.

using System;
using System.Timers;

class Zamanlayici
{
   static void Main()
   {
      Timer t = new Timer(1000);
      t.Elapsed += new ElapsedEventHandler(SaniyelikIs);
      t.Elapsed += new ElapsedEventHandler(Selam);
      t.Start();

      while(true)
      {
      
      }
   }

   static void SaniyelikIs(object o, ElapsedEventArgs a)
   {
      Console.WriteLine(DateTime.Now);
   }

   static void Selam(object o, ElapsedEventArgs a)
   {
      Console.WriteLine("Merhaba Elapsed olayı!");
   }
}

Bu programda Elapsed olayı meydana geldiğinde ilk önce SaniyelikIs() metodu ardından da Selam() metodu çağrılacaktır. Bunun sebebi olayla ilişkilendirilen metotların olay yöneticisine eklenme sırasıdır. İlk eklenen metot ilk çağrılır. Bu programın ekran çıktısı ise aşağıdaki gibi olacaktır.

Bu yazının sonuna geldik. Size Timer sınıfının kullanımını ve dikkat etmeniz gereken bazı noktaları aktarmaya çalıştım.


 

Kaynak : csharpnedir.com


 

C Sharp (C#) İçin Eklenmiş Tüm Makaleler
C Sharp (C#) İçin En Son Eklenen 5 Makale
 Makale Adı  :  C#'da klasör işlemleri
 Yayın Tarihi :  11.04.2009 08:47:40 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  C# ile diziyi tersine çevirme
 Yayın Tarihi :  27.11.2008 08:57:42 Ekleyen :  özen karaçakır Makaleyi Oku  
 Makale Adı  :  Çok Kullanılan Kontroller-1
 Yayın Tarihi :  05.11.2007 10:39:39 Ekleyen :  Kazım Aydın Makaleyi Oku  
 Makale Adı  :  C# ile Kronometre Uygulaması
 Yayın Tarihi :  09.10.2007 11:23:04 Ekleyen :  Zeliha Görmez Makaleyi Oku  
 Makale Adı  :  Overloaded Metotların Gücü
 Yayın Tarihi :  12.08.2007 16:05:03 Ekleyen :  Kazım Aydın Makaleyi Oku  

C/C++
  C ögreniyorum -8-
  C ögreniyorum -7-
  C ögreniyorum -6-
  C ögreniyorum -5-
  C ögreniyorum -4-
  C ögreniyorum -3-
  C ögreniyorum -2-
  C ögreniyorum -1-
  İlk C++ Programımız

JAVA
  Java ile Histogram Eşitleme
  JAVA İçinde Thread Kullanımı
  Serialization İşlemleri 2
  Serialization İşlemleri
  İlk Bakışta JSP
  Servletler ile Web Sayfaları
  Java ile Grafik Çizim
  Java, MySql Bağlantısı
  JBuilder ile Database

PHP
  php dersleri -1-
  php/access ile silme işlemi
  php ile access'e bağlanma - 2
  php ile access'e bağlanma - 1
  Döngü ve Diziler - BÖLÜM 5
  Döngü ve Diziler - BÖLÜM 4
  Döngü ve Diziler - BÖLÜM 3
  Döngü ve Diziler - BÖLÜM 2
  Döngü ve Diziler - BÖLÜM 1

İSTATİSTİKLER
  Toplam ziyaret :  24684
  Toplam üye sayısı :  1077
  Asp makale sayısı :  20
  Asp.Net makale sayısı :  54
  Php makale sayısı :  26
  C/C++ makale sayısı :  51
  C# makale sayısı :  29
  Java makale sayısı :  33
  Toplam makale saıysı :  213
Copyright asundinay® 2007 Her Hakki Saklidir
Tasarim & Programlama asundinay®