Makale Özeti

Giriş

Makale

Giriş

Temel olarak Visual Basic 6.0 ın en büyük dezavantajlarından biriside multi-thread in basit bir şekilde yapılamamasıydı , bazı programcıların (benim gibi ) Böyle bir uygulamayla karşılaştıkları zaman ya bu program VB ile yapılamaz deyip programın başka birisine vermeyi ya da yapılacak multi-thread uygulama parçacıklarının C++ veya Java kullanarak activex veya dll haline getirilerek kullanılması gerekmekteydi. VB.Net ile bunlar artık tarihe karışıyor :)

Özgür Threading

VB6 da thread sadece componentler ve Apartment model multi-threaded ler le mümkündür. Apartment model multi-threaded ler ASP de kullanılan Session veya Application gibi modellerdir.

Vb içerisinde özgür threading uygulamaları VC++ veya java nın yardımı olmadan olışturulamaz

Bu durum VB.net ile değişmektedir. Artık VB.Net güçlü ve etkili bir şekilde VC++ veya java da yapılan Threading uygulamaları gibi uygulamalar geliştirmemize izin veriyor. .NET SDK içerisinde bulunan "System.Threading" kütüphanesinin properties leri ve method ları Threading uygulamalarına izin verir

Şimdi Vb.net ile geliştirilmiş bir Threading Uygulamasını inceleyelim

Imports System

Threading kütüphanesi import ediliyor

Imports System.Threading

Public Class clsMultiThreading

Bu method ile Thread kendi içinde 5 defa donecektir

Public Sub OwnThread()

Dim intCounter as integer

For intCounter = 1 to 5

Console.WriteLine("Class icerigi: " & intCounter.ToString())

Next

End Sub

End Class

Public Class HelloWorldThreadingInVB

Proje exe halindeyken çalıştırılacak ilk sub

Public Shared Sub Main()

Dim intCounter as integer

objMT nin new clsMultiThreading methodu ile declare edildiği yer

Dim objMT as clsMultiThreading = new clsMultiThreading()

System.Threading Kütüphanesi kullanılarak

Thread object için Class in declare edildiği yer

Dim objNewThread as Thread

Thread class kullanılarak yeni bir Thread oluşturuluyor

ve oluşturulan thread in Başlangış Adresi olarak "OwnThread " metthodu seciliyor

objNewThread = new Thread(new ThreadStart(AddressOf objMT.OwnThread))

Thread (clsMultiThreading class) içindeki "OwnThread" methodunun çalıştırıldığı yer

objNewThread.Start()

Çıktıların alınacağı yerler

For intCounter = 10 to 15

Console.WriteLine("Sub Main İçindeki : " & intCounter.ToString())

Next

End Sub

End Class

İlk önce sytem ve System.Threading i projemize import ettik. hada sonra clsMultiThreading isimli bir Public class oluşturduk. Bu class içerisine 5 defa donüp sonuçları console üzerine yazacağı bir Foor loop döngüsü bulunan "OwnThread" methodunu yazdık. Bunun yapmamızdaki amaç klas oluşturulduktan sonra class içindeki OwnThread methodu bizi diğer oluşturan Class lardan ayırd edecektir

Daha Sonra Sub Main methodu nunda içinde bulunduğu "HelloWorldThreadingInVB" isimli diğer class i oluşturduk. Bu method program nezaman çalışırsa ilk olarak devreye gireecek ve programımızın temelini oluşturacaktır.

Sonra Sub Main methodu içerisinde objMT ismi ile "clsMultiThreading" tipinde bir class oluşturuyoruz veya daha doğrusunu söylemek gerekirse "clsMultiThreading" Class ını objMT ye atıyoruz :) Şimdi Bu class ların ve Methodların üzerinde koşacakları "Thread" i oluşturmalıyız Oluşturulan Classlar ve methodlar bunun içine atılarak Free olarak çalıştırılacaktır

"Dim objNewThread as Thread " Deyimi ile objNewThread isimli bir Thread oluşturduk Thread lerin belli bir takım ozellikleri ve methodları vardr. Thread ler de bir process dir. Farkları ise Diğer processlerinin Cpu daki bekleme srasına girmeden onlarlabirlikte cpu ya farklı kanallardan girerek makineyi kilitlemeden çalışmalarıdır.

Thread lerin calişmasini sağlamak için Bir class içindeki her hangi bir methodu başlangiç adresi olarak atamamiz gerekmektedir " objNewThread = new Thread(new ThreadStart(AddressOf objMT.OwnThread)) " "AddressOf " deyimi -adresi ile- ThreadStart( ) de deyimi de -"Thread" i başlat- demektir yukardaki kod ile Thread in başlangiç adresini Oluşturduğumuz yeni objMT (clsMultiThreading Class ının) OwnThread methodu olarak atadık

Dha sonra "objNewThread.Start() " ile Thread imizi işleme soktuk ve altındaki "for next " döngüsüde "Console" a sırasıyla 10 dan 15 e kadar yazı yazılmasını sağlıyacaktır

Process lerden sırasıyla ortaya çıkacak sonuşları düşünürsek objNewThread.Start() deyimi "sub main" içindeki "for loop" döngüsünden daha önce çalışcağı için ekrana "Class içeriği 1 " yazacak ve sonra işlemcini kendisine göre ya submaindeki yazan ("Sub Main İçindeki : " N) yada tekrar ("Class içeriği N") yazılacaktır

Bu birbiri içindeki işleyen fakat ikisi de birbirinden bağımsız processler tamamlandıktan sonraki çıkan sonuç aşağıdaki gibi olacaktır :

Yapılan Örneğin Exe olarak Çalıştırılması

d:\NET> vbc.exe Thread.vb /t:exe /debug /cls

Bu komut ile Thread.vb file i exe haline cevirilir

exe halindeki Thread programının çıktısı şu şekilde olmuştur

-"Class içeriği " 1

-"Class içeriği " 2

-"Sub Main İçindeki : " 10

-"Sub Main İçindeki : " 11

-"Sub Main İçindeki : " 12

-"Sub Main İçindeki : " 13

-"Class içeriği " 3

-"Class içeriği " 4

-"Class içeriği " 5

-"Sub Main İçindeki : " 14

-"Sub Main İçindeki : " 15

Sonuç olarak

Threading Tarzı bir işleme niye ihtiyaç duyayım ki diyenlere bir örnek verebilirim :

Msela yaptığınız bir program ile kullanıcılaraınızın mail adreslerine 3 er adet mail atcaksınız. Sisteminizde de 100 adet kullanıcınız var mail atmak için kullandığınız Smtp servere "hello" diyen herhangi bir component kullana bilir yada kediniz de winsock programlama ile bunu yapabilirsinz smtp servere gönderilen her verinin belli bir bekleme süresi olduğunu ve bu bekleme süresinin yaklaşık yarım saniye kadar olduğunu söyledikten sonra

(3*0,5)*100 =150 sn oda yaklaşık 1,5 dakika etmektedir 100 kişiye mail atmanız bir program ile yaklaşık olarak 1,5 dakika sürmekte ve programınız bu süre zarfı içerisinde eğer önlemini almadıysanız sistem sistem kaynaklarını tamamen kullanacak ve bilgisayarınız kilitlenme noktasına gelecektir Böyle bir durumda 100 ayrı process ile daha kısa bir zaman içinde ve sisteminizdeki hiçbir kilitlenmeye meydan vermeden 100 kişiye mail atmak daha iyi olmaz mı sizce ?

VB.Net her alanda olduğu gibi Threading alanındaki eksikliklerini gidererek tüm VB programcılarının hayallerindeki dil olmaya başlamıştır..