Live Chat Software
Emre CIRIK | Multi Thread - Thread Nedir ? Ne işe yarar ? Nerede Kullanırım

Multi Thread - Thread Nedir ? Ne işe yarar ? Nerede Kullanırım

by EMRCRK 12. May 2011 13:07

Arkadaşlar, bu konu geniş kapsamı olan bir konu fakat ben sizlere özet geçerek anlatacağım. 

Bildiğimiz üzere DOS gibi işletim sistemlerinde ve o güne ait işlemcilerde aynı anda sadece 1 program çalıştırıla biliyordu. Günümüze örnek vermek gerekirse , Windows altında notepadda yazı yazarken , internet explorer 'ı nızı kullanamadığınızı düşünün . İşte bu gibi sistem çalışma mantığı single processing (tek işlem) dir. 

Baktığınız zaman günümüzde işletim sistemleri , cep telefonları bile aynı anda birden fazla uygulama açabiliyor. Ben telefonda müzik dinlerken mesaj yazabiliyorum . Bu çalışma mantığı ise Multi-Processing( Çoklu işlem) dir.

 

Visual Studio gibi güçlü ve multi processing bulunan bir ortamda olupta , multi-processing programlama tekniğini öğrenmemek olmaz diyorum ve konuya yavaştan girelim.

Process (İşlem) = CPU Üzerinde çalışan tek bir program işlem olarak adlandırılır.

Thread (İşlem Parçacığı - Alt İşlem) = Bir Process içinde yaptırılması gereken , alt yordamlar(metot,fonksiyon) çalıştırılması işlemine denir. Örnek : Visual Studio biz kod yazarken , arka planda kod hata yakalama işlemini yapar.

 

.NET Platformu altında Multi Processing işlemleri 

 

.NET 'te Thread 'ler System.Threading namespaces(isim uzayı) altında toplanmıştır ve alt class(sınıflara) bölünmüştür.

 

Thread'leri kullanmak için projenize ilk önce namespaces'i eklemek gerekir .

Bu ilk örneğimiz , nasıl bir hata ile karşılaşabileceğimizi görmek içindir.

private void btnError_Click(object sender, EventArgs e)
        {
            Thread thrTest;// Thread Tanımlıyoruz
            thrTest = new Thread(new ThreadStart(TestFonk));
 // Thread nesnesini oluşturup, hangi alt metodu çağıracağını belirliyoruz
            thrTest.Start();//Thread'i başlatıyoruz
            for (int i = 0; i < 100; i++)
            {
                lstItems.Items.Add("butona tıklandı.");  
// Listbox kontrolüne döngü boyunca öğe ekletiyoruz

            }
            lstItems.Items.Add("...");           
   
        }


         void TestFonk()                              
        {
            for (int i = 0; i < 10; i++)
            {
// çalışmakta olan işlem ise , belli bir süre sonra
// buton click evet i içindeki döngü ile çakışarak
                Thread.Sleep(1000);
                lstItems.Items.Add("Fonksiyon yazıyor!");
 // Tam bu noktada bir hata verir :
 // Cross-thread operation not valid: 
//Control 'lstItems' accessed from a thread other than
// the thread it was created on.
             
            }
            lstItems.Items.Add("Fonksiyon bittii!");
            
        }

 

Gördüğünüz üzere almış olduğumuz bu hata bize aynı anda 2 döngünün bir listbox kontrolüne öğe ekleyemeyeceğini gösterir.Bu tip bir uygulama tabiki çok kullanılmaz ben şahsen bu hatayı görmeniz için uğraştım. Fakat bu hatayı böyle bir uygulama değilde daha çok seriport nesnesi , tcplistener nesnesi ni kullanırken karşılaşma olasılığınız çok yüksektir. Örnek veriyorum , bizzat yaşadığım bir örnektir.

RFID cihazına bir protokol yazmaya çalıştığımda, seriporttan o cihaza ait komutları gönderip sonrada bana verdiği cevapları dinliyordum. Tag üzerine bilgi yazarken güzel sıkıntı yoktu , fakat tag üzerinden bilgi okurken sıkıntı oldu. Çünkü datarecived olayı içerisinde ben hem

seri porttan gelen bilgiyi okuyup aynı anda onu textbox üzerine yazmak istediğimde buna benzer bir hata ile karşılaştım. Çözümü asenkron fonksiyon çağırma tekniğini kullanarak hallettim.

Asenkron Programlama , belirli bir kod parçasını arka planda özel bir thread açarak, ana thread'ten bağımsız bir biçimde çalışmasını sağlar.

 

Hemen seri port uygulamam ile ilgili örnek kodumuda yazıyorum...

 

delegate void WriteTextBox(string data);
        //Delegemizi tanımlıyoruz

        public FrmMain()
        {
            InitializeComponent();
        }


         private void spTest_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
         {
             Thread.Sleep(500);//500mili saniye bekletiyoruz
             string m_spData = spTest.ReadExisting();//gelen datayı değişkene atıyoruz
             m_spData = m_spData.Trim();//boşlukları kaldırıyoruz
             this.BeginInvoke(new WriteTextBox(sp_DataReceived), new object[] { m_spData });//Buradada textbox ı dolduracak metodu çağırıp , parametremizi veriyoruz.
         }
         private void sp_DataReceived(string data)
         {
             txtDataRecived.Text = data;
         }

 

 

 

Kodun içeriğine bakarsak arkadaşlar gayet basit ve kolay olduğunu görüyoruz. Fakat anlamadığınız noktalar muhakkak olabilir, özellikle yeni programlamaya başladıysanız yada ısınma turlarındaysanız. Çünkü delegete yapısı nesne tabanlı programlamanın en önemli özelliklerindendir . Eventlerin oluşmasında birer bir delegete ler kullanılır. Bununla ilgili ileride bir örnek yayınlarım. Thread'konusunu ise ben genel olarak bu şekilde anlattım. Ama bu konuyu daha kapsamlı ve detaylı daha anlaşılır öğrenmeniz için arkadaşlar muhakkak işlemcilerin ve işletim sisteminin  , işlemleri hangi sıralarda ne ölçüde hangi mantıkta çalıştırdığını biraz anlamanız gerekmektedir. Thread'in bir çok özelliği mevcuttur , windows görev yöneticisini incelerseniz işlemönceliği gibi ,işlem durumu , işlem adı gibi birçok özelliği mevcuttur. Farklı teknikler üzerine kullanılabilir. Gerekli kaynakları internet üzerinde gayet güzel açıklanmış şekilde bulabilirsiniz, kafanıza takılan sorularınız için iletişime geçebilirsiniz.

Umarım faydalı olmuştur...

Örnek Uygulama  ( Sample Application ) :

ThreadExample.rar (37,58 kb)

Add comment




  Country flag
biuquote
  • Comment
  • Preview
Loading






Month List

Calendar

<<  December 2016  >>
MoTuWeThFrSaSu
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

View posts in large calendar