VB.NET ile Asenkron Programlama (MultiThreading)

7 Ağu 2008
86
0
Kütahya
Giriş

Geçmişte; yani VB 6 ve öncesinde, MultiThread VB uygulaması yazmak çok zordu. Microsoft bile azimli VB geliştiricilerinin bunu yapmakta zorlandığını bildirmişti hatta, bazı MultiThread-VB yazarları, desteklenmedi ve uygun bulunmadı vesaire...

VB.NET yayınlandığında, VB geliştiricileri sonunda rahat nefes aldı.. Bu makalede, MultiThread kavramına temel bir giriş yapılacaktır. Bir kez, Multithread uygulaması yazdıktan sonra, emin olun, ona hayran olacaksınız... Kendinizi daha fazla geliştirmek için ise; MSDN’den vazgeçmeyin derim. En iyi kaynak orada J

Başlamadan Önce

MultiThreading konusuna geçmeden önce bazı teknik konuları aşağıda belirtmekte yarar görüyorum. Çünkü; MultiProcessing ile MultiThreading kavramları birbiri ile ilişkili ancak tamamen farklı iki kavramdır. Haliyle, MultiThreading’i kavrayabilmek için ayrımını iyi yapmak gerekmektedir.

Single Processing: Bir işlemci bir birim zamanda sadece bir tek process'i (işlemi) çalıştırabilir. Bu çalışma sistemi “Single Processing” tir... Bu sistemi yöneten işletim sistemine ise, Single Processing işletim sistemi denir.

Multi Processing (veya Multi Tasking) : Yine birim zamanda fakat bu kez birden fazla işlemi gerçekleştirebilen çalışma sistemidir ve günümüzde kullandığımız Windows tarzı İşletim Sistemleri ile yönetilirler.

Thread ve MultiThread Nedir ?

Thread, kelime anlamı ve bilgisayar terimleri terminolojisine göre “alt işlem” anlamına gelir. Yani daha açık bir ifadeyle, thread; bir programın bağımsız olarak CPU üzerinde işlenebilen bir parçasıdır. Ayrıca, bir program, bir çok thread’in birleşmesinden meydana gelebilir ve işte bu da MultiThreadingtir. Fakat unutulmamalıdır ki; bir programın illa Multithread bir uygulama olması şart değildir. Fakat birazdan ele alacağımız faydalar, geliştiriciyi Multithread yapısını kullanmaya yönlendirebilir.

Şimdi Thread kavramını bir örnekle irdeleyelim.

Thread’lar bir şirketteki çalışanlara benzerler. Tipik bir şirkette, bütün personeller aynı anda çalışabilir. Bu şirket, çalışan tüm threadleri içeren ve onları ortak bir amaca yönelten İŞLEMCİ’dir. Normal bir uygulama yazıp çalıştırdığınızda, tek thread ile çalışan bir işlem başlatmış olursunuz. Böylece uygulamanız, birim zamanda yalnızca bir işlem yapabilir (tek çalışanlı bir şirket gibi). Değişkenleriniz ve nesneleriniz (object), Ofisteki faks ve fotokopi makinelerine benzer.. Bazıları globaldir ve şirkette çalışan herkes, bu cihazları kullanabilir, bazıları ise yalnızca bir kişiye ya da bir departmana aittir, yani özeldir.

Modern bir İşletim Sistemi aynı anda birçok programı çalıştırmanıza izin verir, bu her bir programın bir ya da daha fazla thread’a bölünmesi ile mümkündür. Eğer makinenizde bir işlemci varsa, birden fazla işlemin tamamen aynı anda çalışması mümkün değildir. Tipik olarak işletim sistemi; ilk işlemin, saniyenin çok küçük bir kesiminde (yaklaşık 20 milisaniyedir ve quanta sayısı olarak adlandırılır), CPU’da çalışmasına izin verir, sonra bir diğer işleme geçerek onu da 20ms’lik quanta süresince CPU’da çalıştırır. Böylece bir anlamda bir iluzyon yaratılarak birçok şeyin aynı anda çalıştırıldığı “izlenimi” verilir.

Aynı zamanda belirli işlemciler ve çok işlemcili makineler, Win2k ve WinXP gibi işletim sistemleri ile iki işlemi ya da iki thread’ı tamamen aynı anda çalıştırabilmek mümkündür.

Neden MultiThreading Kullanılır ?

MultiThreading birçok açıdan çok faydalıdır. Uygulamanızın harici event’lara karşılık vermesi gerekebilir. Harici bir event oluştuğunda, bu event, uygun bir biçimde handle edilmek amacıyla yeni bir thread oluşturur ve böylelikle uygulamanızın donarak kilitlenmesini, haliyle kullanım dışı kalmasını önler. Eğer bunun için, VB.NET uygulamanızda Timer kontrolü kullanırım diyorsanız, Timer’da bir proses olduğundan kendisi ardından başka işlemin yapılmasına izin vermez.

Bir diğer faydası ise şudur; uygulamanızda, arka planda gerçekleşmesini istediğiniz bir görevi; uygulamanızın kullanıcı arayüzü kilitlenmeden (dikkat !! Herhangi bir enabled durumu bile söz konusu olmadan) çalıştırabilirsiniz. Görev bittiğinde, thread, değişkenleri günceller ve böylece ana thread, görevin sona erdiğinden haberdar olur.

Ayrıca Threadlar, birçok görev ve olay üzerinde değişiklik yapmanıza izin verirler.

İşte Uygulama

Bu kadar “string” ifadeden sonra kod aşamasına geçelim
Öncelikle .NET Platformunda, MultiThread yazmak için System.Threading class’ına ihtiyacımız var. Bildiğiniz gibi bunu import da edebiliriz, nesneyi tanımlarken uzun uzun yazmayı da tercih edebiliriz. Ben kod örneğimde, import ettim..

Imports System.Threading

Formumun üzerinde; bir adet button kontrolü var ve name’i, “btnTıK” hemen altında ise bir tane label kontrolü var ve onun name’i ise “lblSayac”.. Bu bilgileri verdikten sonra koda geçebiliriz..

Öncelikle şunu belirtmek zorundayız; bir MultiThreading uygulama geliştirirken unutulmaması gereken en önemli şey; thread’in bir Sub () altında yaşayabilir ve çalıştırılabilir olduğudur. Yani; function gibi, değer döndüren alt progr*****lar ile thread oluşturulamaz. Hatırlatmak gerekirse, yazdığınız function’un döndürdüğü değeri kullanmasanız bile, sınırların dışına bir “object türünde değer” dönecektir.

Bu uyarıdan sonra, Threadimizi yazmak için bir Sub() yazıyoruz :

Public Sub Sayac()

Dim sayac As Decimal

For sayac = 0 To 10000000

lblSayac.Text = sayac

Next

End Sub

Eğer yukarıdaki Sub()’ı Form.Load’a yazsaydık, açılması için sanırım en az bir 20-25 dakika beklememiz gerekecekti. Az değil, tam 10.000.000 (10 Milyon)’a kadar saydırıyoruz ! Ancak örnek bittikten sonra çalıştırdığımızda sanırım MultiThread’in faydasını daha iyi anlayacağız...

Dim xThread As New Thread(AddressOf Sayac)

Yukarıdaki değişken tanımlamasını; Sub’ların dışında yaparak, xThread’ın tüm Sub()’larda tanınmasını sağlayacağım. Bunun sebebi, formun Close olayında anlaşılacaktır :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

xThread.Start()

End Sub

Şimdi, Form’un Load’ında, xThread adında bir Thread oluşturup, AdressOf tümleci ile Sayac sub()’ını çağırdık.

Burada, C# geliştiricileri için bir hatırlatma yapalım; C# syntax’ında da aynı namespace’i kullanıyoruz. Ancak orada, “AdressOf” tümlecini kullanmadan, direk function çağırır gibi sub’ın ismini veriyoruz.

xThread’ı tanımladıktan sonra ise xThread.Start() diyerek Threadın başlamasını sağlıyoruz.

Daha sonra, BtnTık kontrolünün Click eventini de yazarak kodumuzu tamamlıyoruz

Private Sub btnTık_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTık.Click

MsgBox("Tuşa Basıldı")
End Sub

Şimdi, kod bu haliyle çalışır, ancak, makalemizin başlarında da belirtildiği gibi, thread, bağımsız bir parçadır. Bu nedenle, form’u kapatmak, Thread’ı sonlandırmak için yeterli değildir. Bu nedenle; form’un Close’una aşağıdaki gibi müdahale etmemiz gerekecetir :

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed

xThread.Abort()
End Sub

Koda genel olarak bakmak gerekirse :

Imports System.Threading
Dim xThread As New Thread(AddressOf Sayac)
Public Sub Sayac()
Dim sayac As Decimal
For sayac = 0 To 10000000
lblSayac.Text = sayac
Next
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

xThread.Start()
End Sub

Private Sub btnTık_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTık.Click
MsgBox("Tuşa Basıldı")
End Sub

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
xThread.Abort()
End Sub
End Class

Bu makalede; MultiThreading kavramına temel bir giriş yaptık. Daha ayrıntılı ve ileri düzey için Türkçe kaynak problemi söz konusu.. Ancak bu sizin için problem değilse

http://msdn2.microsoft.com/en-us/lib...sx(VS.80).aspx adresinde,

Multithreading in Visual Basic başlığı altında çok iyi anlatım ve örneklerle konuyu ilerletebilirsiniz..
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.