Multi Threating etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Multi Threating etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

5 Mart 2009 Perşembe

Multi Threating (çok kanallı uygulama geliştirme)

Merhabalar
Bu ilk yazım ve bu gün benim için çok önemli bir gün çok katmanlı uygulamalar ile biraz .net servisleri üzerine yoğunlaştım. Merhaba dünya yazdıktan sonra biraz ağır olacak ama
İŞTE MUTLİ THREATING (çok kanallı uygulamalar)
Uygulama geliştirirken temel sorunlarından birisi bir uygulama geliştirirken bir iş yapılırken diğer işlerin hatta .NET için ekranın görüntüsünün bile silinmesi olmaktadır.Hatta bir hesaplama yaparken progressbar'ın ilerlememesi yada formun bir yerlerinde işlem yaparken başka bir işlem yapamamız bu tip durumlar ve senoryalar saymakla bitmez ilacı ise Multi Threating tabiki.
Yazgelistir makalesinden küçük bir alıntı ve yorumlarımı koymayı çok isterim

Buraya kadar thread ile ilgili kafanızda bir şeyler oluşmuştur. Ancak kötü bir haberim var. Threadler gerçekten işlerini aynı anda yapmıyorlar. İşlemci threadlerimize belli bir zaman dilimi veriyor – burada milisaniyelik zamanları düşünelim- threadler arasında çok hızlı geçişler yapıyor ve biz bunu algılamıyoruz. Bu noktada belirtmeliyim ki threadlerin çalışması işlemciden işlemciye bile değişebilir. Birçok algoritması vardır. Örneğin hepsine aynı zaman dilimini ayırılabilir, önceliklerine göre zaman verilebilir, en kısa sürede bitene göre ya da bitimine en az süre kalana göre zamanlama ayarlanabilir. Bu bizi pek ilgilendirmiyor ama.
Thread’lerin “ready”,”blocked”,”running” ve “terminated” durumları vardır. Running moda olan thread aktiftir ve işlemciyi kullanır. Blocked moddaki thread ise beklemededir.(Örneğin bir girdi[input] bekliyordur.) Ready moddaki thread ise çalışma sırasının kendisine gelmesini bekliyordur. Terminated moddaki ise çalışmasını bitirmiştir.


Threat mantığından ve proceslere nasıl .net framework'un paylaşım yaptığından bahis ediyor.
yani aslında bir işlem yapılırken siz başka bir işlemi yaptığınızda işlemci sizin yaptığınız olay process lerine odaklanıyor ve olay process bittiğinde ise kaldığı yerden devam ediyor böyle çok katlı bir imaj veriliyor (Çift çekirdekli sistemlerde mimari ve işleyiş nasıldır bilmiyorum ? şu an belki process ler hiç bölünmüyordur)


Thread ile ilgili mantıksal anlatım yeterli olmuştur sanırım. Artık C# ile kullanmaya başlayalım.
Thread ile çalışmak için System.Threading isim uzayını kullanmalıyız.
Örnek bir uygulama yapmak istiyorum. Bir adet listBox ve 4 adet buton kontrolünü forma yerleştirelim. (Başlat düğmesi, Duraklat Düğmesi, Devam Et Düğmesi, İptal Et Düğmesi)
Başlat düğmesine basınca sayılar yazılsın, bunu duraklatıp devam edebilelim ya da iptal edebilelim.


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace ThreadDeneme0
{
public partial class Thread1 : Form
{
public Thread1()
{
InitializeComponent();
}
private void Thread1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread t = null;
private void btnBaslat_Click(object sender, EventArgs e)
{
ThreadStart ts = new ThreadStart(Yazdir);
t = new Thread(ts);
t.Start();
}
public void Yazdir()
{
for (int i = 0; i < 10000; i++)
{
listBox1.Items.Add(i);
}
MessageBox.Show("Bitti");
}
private void btnDuraklat_Click(object sender, EventArgs e)
{
t.Suspend();
}
private void btnDevamEt_Click(object sender, EventArgs e)
{
t.Resume();
}
private void btnIptal_Click(object sender, EventArgs e)
{
t.Abort();
}
}
}


Kırmızı yazdığım alttaki kodlara dikat işte bu kodlar yeni bir kanal açıp ele avuca sığmaz programlar yapmamızı sağlıyor.
ThreadStart ts = new ThreadStart(Yazdir);
t = new Thread(ts);t.Start();

Thread konusunun daha da anlaşılır olması için uygulamamıza bir eklenti daha yapacağım. 5. Bir düğme daha ekleyin forma. Click eventine ve altına aşağıdaki kodu yazın.


private void button5_Click(object sender, EventArgs e)
{
Thread u = new Thread(Goster);
u.Start ;
}
void Goster()
{
MessageBox.Show("Siyah beyaz-ölüm yaşam");
}


Normalde bir mesaj kutusu çıkınca sizinle etkileşime girerdi. Yani bir tuşa basardınız ve arka plandaki çalışma ondan sonra devam ederdi, siz mesaj kutusunda bir düğmeye vs. basmadıkça tüm işler dururdu. Ancak göreceksiniz ki bir tarafta mesaj kutusu açık kalacak, diğer tarafta ana forma geçiş yapabileceksiniz ve orada da işlerin sürdüğünü göreceksiniz.

Threat ile ilgili harika bir örnek vererek yazımı burada bitiyor.