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; MSDNden 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, MultiThreadingi 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 threadin 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.
Threadlar 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 threada 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), CPUda çalışmasına izin verir, sonra bir diğer işleme geçerek onu da 20mslik quanta süresince CPUda ç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 eventlara 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, Timerda 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 namei, btnTıK hemen altında ise bir tane label kontrolü var ve onun namei ise lblSayac.. Bu bilgileri verdikten sonra koda geçebiliriz..
Öncelikle şunu belirtmek zorundayız; bir MultiThreading uygulama geliştirirken unutulmaması gereken en önemli şey; threadin 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 functionun 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.Loada 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 MultiThreadin faydasını daha iyi anlayacağız...
Dim xThread As New Thread(AddressOf Sayac)
Yukarıdaki değişken tanımlamasını; Subları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, Formun 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ı namespacei 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, formu kapatmak, Threadı sonlandırmak için yeterli değildir. Bu nedenle; formun Closeuna 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..
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; MSDNden 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, MultiThreadingi 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 threadin 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.
Threadlar 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 threada 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), CPUda çalışmasına izin verir, sonra bir diğer işleme geçerek onu da 20mslik quanta süresince CPUda ç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 eventlara 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, Timerda 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 namei, btnTıK hemen altında ise bir tane label kontrolü var ve onun namei ise lblSayac.. Bu bilgileri verdikten sonra koda geçebiliriz..
Öncelikle şunu belirtmek zorundayız; bir MultiThreading uygulama geliştirirken unutulmaması gereken en önemli şey; threadin 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 functionun 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.Loada 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 MultiThreadin faydasını daha iyi anlayacağız...
Dim xThread As New Thread(AddressOf Sayac)
Yukarıdaki değişken tanımlamasını; Subları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, Formun 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ı namespacei 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, formu kapatmak, Threadı sonlandırmak için yeterli değildir. Bu nedenle; formun Closeuna 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: