7 Ocak 2009 Çarşamba

c# ile thread kullanımı(Using Thread with c# )

İlkonce C# ta basit bir thread nasıl kullanılır ona bakacağız daha sonra multi-threadlere bakacağız.
Thread iş parçacığı deemktir ve proses'in alt dallarıdır.Threadleri pipe yontemi ile kullanarak işleminin aynı anda birden fazla işlem yapmasını sağlarız.Örn aynı anda birden çok omut işlenemez ama bunu yuksek hızda boru hattı prensibine göre ayarladığınız zaman bize farkettirmeden aynı anda birden fazla iş yapıyormuş gibi davranır.Bir çok işlemde kullancağımız timer nesnesi işte sınıf yordamıyla işlem yapar.Threadler biraz karışık ve uzun bir konu onun tafsilatını diğer sitelere bırakalım biz onu nasıl kullanacağız şimdi onu görelim.
Uygulama şu-> Arka arkaya bir dizin içindeki resimlerin geçişi bir nevi slayt :)
eklemeiz gereken kutuphane --->
using System.Threading;
using System.IO;
bir thread kendisinin oluştuğu bir nesneyi referans alarak çalışırlar ve aynı nesne uzerinde birden fazla thread kullanımını daha sonra göreceğiz İNŞAALLAH...
gelelim thread sınıfına
Thread t;
t=new Thread(new ThreadStart(void());
bu gövde bir thredin oluşması ve parametre alımıdır.Dikkat ettiysek void dedik neden?
Çünkü yaptığımız method void bir fonksiyon olması gerekiyor aksi takdirde geri dönüş değerini tutmamız lazımdır.
t=new Thread(new ThreadStart()) ;
kanallama yapacağımız metodu burada belirttikten sonra slayt geçişinin kodunu verelim
public void bas()
{
path = Directory.GetFileSystemEntries(@"C:\...", "*.gif"); //resimlerin bulunduğu klasor

foreach (string dosya in path)
{
pictureBox1.Image = System.Drawing.Image.FromFile(dosya);

Thread.Sleep(1006); //thredi uyutuyoruz.İnterval gibi düşünebiliriz
}

bas(); //rekursif fonksiyon
}
son olarak yukarıda verdiğimiz thred gövdesi şöyle olur
ve bunu bir event'le çağırırsak işlem tamamdır
t = new Thread(new ThreadStart(bas));

t.Start();
şeklinde çalışır.

Umarım işinize yarar kolay gelsin...

http://www.filefactory.com/file/a17ha3h/n/thread.rar

Hasan Bozkurt Gaziantep


10 yorum:

  1. thread i uyutma işlemini double değişken türüyle niye yapamıyoruz, bana 1000 mili saniye yetmiyor ne yapmam lazım

    YanıtlaSil
  2. ya timespan cinsinden ya da int değeri uzerinden deger verirsiniz...Int degeri size yetmiyorsa bunu bir döngü ile çağırabilirsiniz....
    2^32 ye kadar değer verebilirsiniz ayrıca

    YanıtlaSil
  3. ya hocam orjinal birşeyler yapacaksanız milletin işini yarayacaksa yapın yoksa internette boş makale çok siz de bunların sayısını arttırmayın...

    YanıtlaSil
    Yanıtlar
    1. uyarınız için teşekkürler ....c# ile kod yazmaya yeni başladığım dönemlerdi...kusurabakmayın...kolay gelsin

      Sil
    2. "ya hocam orjinal birşeyler yapacaksanız milletin işini yarayacaksa yapın yoksa internette boş makale çok siz de bunların sayısını arttırmayın..."

      Bu nasıl bir laf anlamadım. Adam uğraşmış bir şeyler paylaşmış. Teşekkür edeceğine birde hadsizlik ediyorsun. Terbiyesizliğin lüzumu yok. Ayrıca boş makale yoktur. Senin kapasiteni aşan makale vardır. Anlamıyorsundur ondan boş geliyordur. Gerçekten yazıklar olsun. Ayıp denen bir şey var.

      Sil
  4. Hasan Hocam
    C# ve acceste hazırlamış olduğum windows uygulamasında veri çekerken ekranda donma oluyor işlemi her nekadar da yapsa sonucu ekrana aktarırken bekletiyor.
    yazmış olduğum kod ;

    try

    {
    baglan();
    DataTable dt = new DataTable();
    OleDbDataAdapter ad = new OleDbDataAdapter("SELECT * FROM MevcutPersonel", conn);
    ad.Fill(dt);
    dataGridView2.DataSource = dt; conn.Close();
    }
    catch (Exception hata)
    {
    MessageBox.Show(hata.Message);
    }
    bu kodlamada kayıt sayısı 300 e kadar işlemi yapıyor ancak sayı arttıkça ekran donuyor ve aktarım çok geç oluyor aktarımı yapıyor. Acaba kayıtları parça parça alabileceğim ve ekranı dondurmadan bu işlemi yaptırabileceğim bir kod varmı?

    teşekkürler

    YanıtlaSil
  5. Hasan Hocam
    C# ve acceste hazırlamış olduğum windows uygulamasında veri çekerken ekranda donma oluyor işlemi her nekadar da yapsa sonucu ekrana aktarırken bekletiyor.
    yazmış olduğum kod ;

    try

    {
    baglan();
    DataTable dt = new DataTable();
    OleDbDataAdapter ad = new OleDbDataAdapter("SELECT * FROM MevcutPersonel", conn);
    ad.Fill(dt);
    dataGridView2.DataSource = dt; conn.Close();
    }
    catch (Exception hata)
    {
    MessageBox.Show(hata.Message);
    }
    bu kodlamada kayıt sayısı 300 e kadar işlemi yapıyor ancak sayı arttıkça ekran donuyor ve aktarım çok geç oluyor aktarımı yapıyor. Acaba kayıtları parça parça alabileceğim ve ekranı dondurmadan bu işlemi yaptırabileceğim bir kod varmı?

    teşekkürler

    YanıtlaSil
  6. sayfalama yapabilirsiniz...bunun için top 100 komutuyla verileri çeker daha sonra arka tarafta verilerin geri kalanını doldurursunuz...Kullanıcıya hissettirmeden.Hiç bir veritabanı uygulamasında tüm kayıtlar listelenmez ama tabii size kalmış...thread kullanarak bunu kanallayabilirsiniz.ayrıca access file system olduğu için verileri sürekli diskten okur.Dolayısıyla diğer veritabanlarına göre yavaştır.

    YanıtlaSil
  7. peki söylediğiniz işlemi nasıl yapacağım top 100 ile ilk yüz kaydı aktardım geri kalan kayıtları nasıl aktarabilirim kodu yazmamda yardımcı olursanız çok sevinirim.
    Teşekkürler...

    YanıtlaSil
  8. KULLANDIĞINIZ vtys sisteminin özelliğine göre row_num>100 olanları çekip datasete thread ile aktarabilirsiniz...her yüz kayıtta bir bind edebilirsiniz....ya da scroll hareketlerini stepleyerek virtual mod kullanabilirsiniz...Bunun için devexpress de vardı ya da datagridview virtual mod c# diye aratırsanız bişeyler cıkar.

    YanıtlaSil

Yorumlarınızda ahlak dışı sozler kullanmayın.Site Bilgi Paylaşım sitesidir.