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


19 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
    3. hakketen bu nasıl bir tavır sana ne kardeşim sen biliyorsan geçip gidersin yeni başlayanların işine yarar. En uyuz olduğum şey şu yazılımcıların gereksiz egosu. Kimseyi beğenmeyin aman en iyi kodda kendi yazdığın hiç kimse senin gibi yazamaz :)))

      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
  9. hocam öncelikle teşekkürler thread atadığım metodun static olması gerektiğini söylüyor. Metodu static yaptığımda da diğer sınıflardan kullandığım değişkenlerin hepsi hata veriyor. bu sorunu nasıl aşabilirim?

    YanıtlaSil
  10. hocam öncelikle teşekkürler. thread atadığımız metodun static olması gerektiğini söylüyor. metodu static yapacağım zaman, metodda kullandığım static olmayan bir sürü sınıf değişkeni var, sorun veriyolar. bu sorunu nasıl aşabilirim?

    YanıtlaSil
    Yanıtlar
    1. kodunuz görmem lazım.Büyük ihtimal thread nesnesini static claas ya da metod içinde tanımlıyor olabilirsiniz.

      Sil
  11. Hasan bey merhaba makaleniz yeni başlayanlar için (Ben :) )cok faydalı bence.Şöyle bi sorum olacak farklı bir Thread'a nasıl bağlanabiliriz fakat Thread gizli önde görünen Thread'a bağlanıyorum tüm adresslerin değeri '0' çıkıyo yani önlem alınmış yardımcı olursanız cok teşekkur ederim.

    YanıtlaSil
    Yanıtlar
    1. Farklı çalışan threadleri senkronize etmek çok kapsamlı hatta akademik bir konu :) Şu kadar söyleyeyim en kolay yolu threading pool deneyin olmuyorsa kendi yönetim mekanizmanızı yapmalısınız.Bunu da yaparken main thread and worker thread kavramlarına bakmalısınız.Kolay gelsin

      Sil
  12. Üç farklı pastacının elinde pasta yapmak için gerekli malzemelerden (un, yağ ve şeker) sadece bir
    tanesi mevcut olsun. Tedarikçinin elinde ise bu malzemelerden sonsuz olmasına rağmen her
    dağıtımda sadece 2 farklı malzeme sağlamakta (yağ+un, yağ+şeker veya un+yağ). Tedarikci ve
    pastacılar için birer process veya thread oluşturun (toplam 4 tane). Tedarikçi her dağıtımda elinde
    diğer malzemeyi tutan pastacıyı uyandıracak. Örneğin un ve yağ dağıtımı yapıyorsa, elinde şeker olan
    pastacıyı uyandıracak. Her pastacıda pasta yapabilmek tedarikçiyi uyandıracak ve gerekli malzemeleri
    dağıtılmasını bekleyecek. Bütün pastacılar belli sayıda pasta yaptığında (her pastacı için farklı olabilir),
    program sonlanacak. Tedarikçi her dağıtımda bir pasta yapımına yetecek kadar malzeme sağlamakta.Bu Problemi c# ta nasıl çözebilirim yardım ederseniz sevinirim...

    YanıtlaSil
    Yanıtlar
    1. Kopya çekmeyiniz. Her ödev kendi emeğinizin ürünü olmalıdır.

      Sil
    2. meltem hanım ilginiz için teşekkür etmekle beraber ödevinizi yapmıyorum. fakat sorunuza şöyle yardımcı olayım.ilkönce main thread oluşturacaksınız.Daha sonra worker threadler ile işlem yapıp o worker thread işi bittikten sonra ya da işleme başlamadan diğer worker threadi çağırıp beraber kill olacaklar.main thread hep uyanık olacak ve pastacı tarafında çağrı bekleyecek (event).Diğerleri create-kill mantığıyla olacak

      Sil

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