Pages

Çok Kanallı(Multithreaded Programming) Programlamaya Giriş 1

C# ın bir çok önemli özelliğinden biride ÇokKanallı programlamayı(Multithreaded programming) standart olarak desteklemesidir. Bu sayede bir çok dilde karşılaşılan problemler minimize edilmişti.
Çok kanallılık aslında multitasking(çok görevlilik) in özelleşmiş bir şeklidir.2 ayrı tipde çok görevlilik mevcuttur.Proses tabanlı ve kanal tabanlı.

Proses tabanlı programlar yani bilgisayarda eş zamanlı olarak birden fazla programın çalışmasıdemektir. Bir yandan interneti kullanırken eşzamanlı olarak kelime işlemcisini de çalıştırmanıza denir.

Kanal tabanlı programlama ise yine kendi içinde 2 ye ayrılır.Foreground (ön kanal) ve background (arka kanal) olmak üzere. Bu iki kanal arasındaki fark ise . Geri planda çalışan background kanalının prosesindeki tüm foreground kanallar kapandığında otomatik olarak kapanmasıdır.

C# da Multithreaded programming için gerekli kütüphane Using System.Threading isim uzayında bulunmaktadaır. Ve çok kanallılık sistemi çalışma kanallarını paketleyen Thread sınıfı üzerine kurulmuştur.

Şimdi bir örnek ile kanal açmayı gösterelim

Using System;
Using System.Threading;


class Kanal{

public int sayac ;
public Thread kanal;

public Baglantı(string name){
// kanal açmak için nesneden gelen ismi alıp burda kanalımızı açıyoruz.
sayac=0;
kanal = new Thread (new ThreadStart(this.run));
kanal.name=name;
kanal.start();

}
void run(){
//kanalımızın başlangıç noktası burası
Console.WriteLine("Kanal başlatıldı");
do{
Thread.Sleep(300);
Console.WriteLine("kanal çalışıyo"+sayac);
sayac++;

}
while (sayac<10)
}
Console.WriteLine("Kanal Kapanıyor..");
}

class KanalAcma{
public static void Main() {
//kanal açmak için gerekli nesneyi tanımlıyoruz.
Kanal knl = new Kanal("ibrahim");

do{
// enson kapanması gereken ana kanal burası . burda kapatıyoruz.
Console.WriteLine("Ana kanal kapatılıyor...");
Thread.Sleep(200);
}
while(sayac!=10)

}
}

yukarıdaki örnekte bir tane kanal açtık Şimdi birden fazla kanal açmamız gerektiğinde ne yapacağız.Yapacağımız şey basit
aşağıdaki satırda olduğu gibi başka kanallar ekleyerek birden fazla kanal açabiliriz.
Kanal knl = new Kanal("ibrahim");
Kanal knl2 = new Kanal("özbey");
.
Fakat birden fazla kanal açtığımızda Düşünmemiz gereken başka durumlar ortaya çıkıyor.
Aynı kanal aynı anda iki yerden kullanılmak istenirse ne olacak. İşte ozaman Düşünmemiz gerekn kanal öncelikleri ortaya çıkacaktır. Yüksek öncelikli kanal bağlanır sonrada işi bitince diğer kanal bağlanır gibi

KANAL öNCELİKLERİ

thread sınıfının Priority özelliklerini kullanıcaz.Genel kullanımı şu şekildedir.
Public ThreadPriority Priority{get ; set ;}
burda ThreadPriority Aşagıdaki beş özelliğe sahiptir.
ThreadPriority.Highest
ThreadPriority.AboveNormal
ThreadPriority.Normal
ThreadPriority.BelowNormal
ThreadPriority.Lowest

bu özellikeleri kullanarak kanala öncelik veririz ve kanal önceliği önde olan bağlanır ve kanalı kititler. o kanalı bırakınca sonraki önceliği olan bağlanır.
Kanal içinb var sayılan öncelik ThreadPriority.Normal Dir

bunu ise programımıza şu sekilde ekliyoruz.

Kanal knl = new Kanal("ibrahim");
Kanal knl2 = new Kanal("özbey");

kanalı tanımladıktan sonra öncelik sırasını ayarlıyoruz
knl.Kanal.Priority=ThreadPriority.Normal
knl2.Kanal.Priority=ThreadPriority.Highest

ayrıca temel kanaldan önce diğer kanalların sonlandığından emin olmak istiyorsak İsAlive () kullanabiliriz. Bunu ise Kodumuzun main kısmına şu şekilde ekleyebiliriz.

public static void Main() {
Kanal knl = new Kanal("ibrahim");
do{
Console.WriteLine("Ana kanal kapatılıyor...");
Thread.Sleep(200);
}
while(knl.Kanal.IsAlive&&knl2.Kanal.IsAlive)//burda temel kanalımız diğer iki kanal sonlanmışsa kapanacaktır
}