Thread bilgisayar biliminde, bir programin kendini es zamanli birden fazla is parçasina ayirabilmesinin bir yoludur. Thread ve islem arasindaki fark bir isletim sisteminden digerine degismekle birlikte genel olarak thread olusturulusu ve kaynaklari paylasmasi açisindan process'den ayrilir. Çoklu thread'ler paralel olarak pek çok bilgisayar sisteminde uygulanabilir. Tek islemci kullanildigi durumlarda çok thread' li uygulama zaman dilimleme ile gerçeklestirilir; tek islemci fakli thread' lar arasinda çok hizli geçis yapar ve bu durumda islemler gerçekte olmasa bile es zamanli kosuluyormus izlenimi verir. Çok islemcili sistemlerde farkli thread' ler farkli islemciler üzerinde es zamanli olarak çalisabilir.
.

Pek çok modern isletim sistemi bir is düzenleyicisi yardimiyla hem zaman dilimleme hem de çok islemcili thread' lemeyi desteklemektedir. Isletim sistem çekirdegi (kernel) sistem çagrilari vasitasi ile programciya thread' leri kontrol etme imkâni saglamaktadir. Bunun yoklugunda programlar, zamanlayicilar, sinyaller veya diger yöntemleri kullanarak kendi çalismalarini sonlandirabilirler. Bunlara user-space thread' ler denir.

     Bizde yazdigimiz programlarda ayni anda birden fazla islem yaptirmak istiyorsak Threadleri kullanabiliriz. Farkli threadler ayni fonksiyonu kullanabilecegi gibi her thread farkli bir is yapan ayri fonksiyonlarida kullanabilir. Threadleri kullanarak basit bir uygulama yazalim.
.

Thread thread1 = new Thread(new ThreadStart(ProgressBar1Doldur));
Thread thread2 = new Thread(new ThreadStart(ProgressBar2Doldur));
Thread thread3 = new Thread(new ThreadStart(ProgressBar3Doldur));

thread1.Start();
thread2.Start();
thread3.Start();

Yukaridaki kodda gördügünüz gibi ilk olarak yeni bir thread olusturuyor ve bu threadin kullanacagi fonksiyonu da ThreadStart nesnesi içinde yaziyoruz. thread1.Start() dedigimiz zaman ThreadStart içine yazmis olugumuz kodlar ilgili thread tarafindan islenmeye baslar.

public void ProgressBar1Doldur()
{
    while (progressBar1.Value < 100)
    {
        progressBar1.Value += 1;
        Thread.Sleep(10);
    }
}

public void ProgressBar2Doldur()
{
    while (progressBar2.Value < 100)
    {
        progressBar2.Value += 1;
        Thread.Sleep(60);
    }
}

public void ProgressBar3Doldur()
{
    while (progressBar3.Value < 100)
    {
        progressBar3.Value += 1;
        Thread.Sleep(50);
    }
}

.
Her thread olusturulurken belirlenmis olan fonksiyon içindeki kodlari çalistirir ve fonksiyonda ki islemler bittigi zaman otomatik olarak sonlanir.

Asagidaki formu dizaynini yapip yukaridaki gibi bir kod yazar ve derlerseniz “Çapraz is parçacigi islemi geçerli degil: 'progressBar1' denetimine olusturuldugu is parçacigi disinda baska bir is parçacigindan erisildi.” Diye bir hata alirsiniz. Bunun sebebi threadlerin senkronlanmadigindandir. Bir threadin kullandigi bir nesneye baska bir thread erismeye çalistigi anda yukaridaki hatayi alirsiniz. Bu hatayi almamak için threadleri senkron olarak çalistirmaniz gerekiyor. Threadleri senkron olarak çalistirma konusuna daha sonra girecegiz. Simdili yukaridaki hatayi engellemek için threadleri çalistirmadan ince asagidaki kodu ekleyin.

System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false;
 
Thread thread1 = new Thread(new ThreadStart(ProgressBar1Doldur));
Thread thread2 = new Thread(new ThreadStart(ProgressBar2Doldur));
Thread thread3 = new Thread(new ThreadStart(ProgressBar3Doldur));

thread1.Start();
thread2.Start();
thread3.Start();

Örnek uygulamamizi buradan indirebilirsiniz.

15 Responses

  1.  20 tane site gezdim dogru duzgun bir ornegi birtek sizin makalenizde buldum . Tesekkür ederim 

  2. selam herkese. arkadaslar bana thread ile kronometri yapimi gerekiyo da yardimci olur musunuz acaba

  3. Gerçekten çok güzel makale. Çok basit ve isin özü anlatilmis. Çok tesekkür ederiz.

  4. söylediginiz blogu  da ismide bilmiyorum. Ama sunu biliyorumki genelde insanlar bizim sitemizde makale kopyalarla biz baskalarindan degil. blog reklamimi yapmaya çalsiyorsunuz yoksa ? Öyleyse güzelce söyleyin ise yarar bi blog sa linkini koyalim, maksat insanlara yardim etmek.

  5.  Bu örnek Fatih Durgut un blogundaki video materyallerden mi alindi ? Keza ayni örnek orada da vardi yanlis hatirlamiyorsam.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.