C# THERET NEDİR ?
Windows işletim sisiteminin önemli özelliklerinden biri de multithreaded bir mimariye sahip olmasıdır. Peki multithreaded (çok kanallı) program ne demektir ? Genellikle proses ve thread kavramları birbirine karıştırılır. Derlenip çalıştırılan bir programa işletim sistemi içersinde yer alan bir proses denir. Örneğin bir hesap makinası programı ile resim programını ard arda çalıştıralım. Bu iki program işletim sistemi tarafından iki ayrı proses olarak ele alınır. Bu iki program birbirlerinin yaptığı işlemlere müdahale etmez. (İstersek prosesleri birbirlerine müdahale edecek şekilde programlayabiliriz. Genellikle bu istisnayi bir durumdur.) Her proses kendi bellek alanı içersinde koşmaya devam eder. Thread ise bir proses içersinde yer alan ve işlem yapan bir rutindir. Bir proses içersinde birden fazla thread var olabilir. Threadler genellikle bir proses içersinde ayrı kanallarda paralel olarak çalışması istenen metodların yürütülmesinde kullanılır
Threadler sayesinde ayrı metodları aynı anda çalıştırabiliriz. İşletim sistemi her threade çalışması için belli bir zaman aralığı verir. Bu zaman aralığı dolduğunda çalışan threadden çıkılıp, program içersindeki diğer bir metoda veya başka bir threade girilir. Bir metod içersinde yapılan iş ne kadar uzun sürüyorsa o metodun bağlı olduğu threadde o kadar fazla zaman harcanır. Bazen bu süre o kadar fazla olur ki, proses içersindeki başka bir threade çalışması için çok az zaman kalır. Başlatılan threadlerin aynı anda senkron bir şekilde çalışabilmesi için .NETte senkronizasyon teknikleri kullanılır. Burada aynı andalığı (senkronizasyon) biraz açmamız gerekebilir. Örneğin üç tane kanalımız (thread) olsun. Her bir kanalda bir progressbar dolduruluyor olsun.
KOD:
namespace Multi_Threading2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
Thread th01;
Thread th02;
private void button1_Click(object sender, EventArgs e)
{
th01 = new Thread(Doldur01);
th01.Start();
}
private void button2_Click(object sender, EventArgs e)
{
th02 = new Thread(Doldur02);
th02.Start();
}
private void Doldur01()
{
for (int i = 0; i < 1000000001; i++)
{
progressBar1.Value = i / 10000000;
}
}
private void Doldur02()
{
for (int i = 0; i < 1000000001; i++)
{
progressBar2.Value = i / 10000000;
}
}
private void btnBeklet01_Click(object sender, EventArgs e)
{
if (th01 != null && th01.IsAlive)
{
th01.Suspend();
}
}
private void btnBeklet02_Click(object sender, EventArgs e)
{
if (th02 != null && th02.IsAlive)
{
th02.Suspend();
}
}
private void btnDevam01_Click(object sender, EventArgs e)
{
if (th01 != null && th01.ThreadState == ThreadState.Suspended)
{
th01.Resume();
}
}
private void btnDevam02_Click(object sender, EventArgs e)
{
if (th02 != null && th02.ThreadState == ThreadState.Suspended)
{
th02.Resume();
}
}
private void btnDurdur01_Click(object sender, EventArgs e)
{
if (th01 != null && th01.IsAlive)
{
if (th01.ThreadState == ThreadState.Suspended)
{
th01.Resume();
}
th01.Abort();
progressBar1.Value = 0;
}
}
private void btnDurdur02_Click(object sender, EventArgs e)
{
if (th02 != null && th02.IsAlive)
{
if (th02.ThreadState == ThreadState.Suspended)
{
th02.Resume();
}
th02.Abort();
progressBar2.Value = 0;
}
}
}
}
Yorumlar
Yorum Gönder