.NET Compact Framework 2.0 - Mobil Cihazlarda System.Threading.Thread

Eylül 15, 2008 15:18 tarihinde ekinozcicekciler tarafndan eklenmistir.

Günümüz internet altyapısı incelendiğinde dağıtık uygulamasenaryolarında işlemlerin belirlenen süreçler yerine anlık altyapı yoğunluğunagöre değişiklik gösterdiğini rahatlıkla anlayabiliriz. Bu noktada işlemingerçekleştiği süreç esnasında uygulamanın o an görünen ekranının kilitlenmesiyerine Asenkron Mimari üzerinden bir uygulama dizaynı uyguladığımızda işleminuygulama process’ i içerisinde farklı bir thread (şerit) üzerindençalıştırıldığını ve işlemin çalıştığı süreç esnasında uygulamamızın normalseyrinde çalışıyor olmasını sağlayabiliriz. Bu noktada mimarininuygulanabilmesi için farklı yöntemler söz konusudur. Bunlardan ilki işleminuygulama içerisinde tanımlananan yeni bir thread içerisinde çalıştırılması ikenbir diğeri ise –ki yönetimi çok kolay olmakla birlikte aslında arka taraftaaynı kapıya çıkmaktadır- delegelerin kullanılması ile sağlanan çözümdür. Bumakalemizde “Mobil Cihazlar” üzerinde threadleri kullanarak Asenkron Mimariüzerinde nasıl çalışacağız bu konu ile ilgili açıklayıcı bir örnekgeliştireceğiz.

Örneğimize başlamadan önce basit bir senaryo üzerindeyoğunlaşalım. Mobil Cihazlarında kullanıldığı dağıtık bir uygulama senaryosugeliştirelim. Bir ilaç şirketinde çalışan ve sahada gün içerisinde merkez ileellerindeki Pocket PC’ ler üzerinden iletişim kuran saha elemanları. Bu noktadaelemanın bulunduğu nokta, baz istasyonu ile arasındaki bağlantının tutarlılığıv.b. gibi birçok etken bağlantı kurulduktan sonra gerçekleştirilen işlemin sonlandırmasürecini önemli ölçüde etkilemektedir. Bu noktada saha elemanının merkez noktaüzerinde bağlantı kurmak istediği zaman sürecinde bu işlem sonlanana kadarmobil cihazı üzerinde bulunan uygulamayı kilitlenmeden kullanabilmesi diğerişlerin gerçekleştirilmesi açısından önemli bir etkendir. İşte bu noktadaAsenkron Mimari devreye girmektedir. Geliştirecek olduğumuz örnek uygulamaüzerinde böyle bir uygulama senaryosunu gerçekleştiremediğimizden aynıkilitlenme ortamını oluşturabileceğimiz klişe bir örnek üzerinde konuyuinceleyeceğiz. 20000 adet sayının bir liste kutusuna yazdırıldığı süreci elealalım. Aynı problem bu noktada yine yaşanacaktır. Sayıların listelenmesisüresince uygulamanın ana ekranı üzerinde herhangi bir işlemgerçekleştirilemeyecek ; belkide uygulama kilitlenip sonlanacaktır.

Daha fazla vakit kaybetmeden uygulamımızı geliştirmeyebaşlayalım. Konu ile ilgili çalışabilmek için bir C# Smart Device WindowsApplication projesi açıyoruz.

Bir sonraki adımda şekilde görülen basit formu tasarlıyoruz.Formumuzun üzerinde bir buton birde Liste kutusu kontrolü yerleştiriyoruz.

Amacımız listele butonuna bastığımız noktada liste kutusuiçerisine 20000 adet sayının listelenmesi. Kulağa basit gelmekte olabilir. Amasayı miktarının fazla olması bu noktada uygulamanın Asenkron Mimari üzerindengeliştirilmesi gerçeğini ortaya çıkarmaktadır. Bu noktada önce standartyaklaşımla şekildeki kod bloğunu geliştiriyoruz.

Sıra geldi uygulamamızı bu haliyle çalıştırmaya. F5’ ebasarak projemizi çalıştırıyoruz ve Button’ a tıkladığımız zaman uygulamanınana ekranının kitlediğini çok rahat bir şekilde analiz edebiliriz. Eğer bunoktada formumuzun üzerinde görsel açıdan farklı amaçlar için yerleştirilmişWindows Form kontrolleri bulunsaydı bu kontroller üzerinde işlem sonlananakadar kesinlikle bir değişiklik yapamayacak ; haliyle işlemin sonlanmasınıbeklemek zorunda kalacaktık. Uygulamanın çalışır haldeki görüntüsü şekildekigibidir.

Şekildende farkedilebileceği üzere Scrollbar’ ın küçük olmasınarağmen (yani sayılar listelenmesine rağmen) ekranın kilitli görünümünden ötürübu sayıları uygulamamız gösterememektedir. Peki çözüme nasıl ulaşacağız ?

Yazının başındada belirttiğimiz gibi Asenkron Mimarikullanarak bu probleme çözüm bulabilir. Bu noktada Asenkron Mimariyi biruygulama üzerinde uygulayabilmemiz için birçok farklı yöntem bulunmaktadır. Fakat.NET Compact Framework’ ün ise bu konuda bazı sıkıntıları bulunmaktadır. Bunlardanen önemlisi uygulama geliştiriciler .NET Compact Framework üzerinde delegelerikullanarak Asenkron Mimariye sahip uygulamalar geliştirememektedirler. Olaya buaçıdan baktığımızda kullanılabilecek tek yöntem System.Threading namespace’ iiçerisinde bulunan Thread sınıfınından yararlanmak olacaktır.

Thread sınıfı, adından da anlaşılabileceği üzere Process’lerin temel birimi olan Thread (Şerit)’ ler ile ilgili çalışmak üzeretasarlanmış bir sınıftır. Arkada tarafta işletim sistemi üzerinde tanımlı birçok metodu Managed ortamda uygulama geliştiricilere çok daha kolay bir arayüzüzerinden sunmaktadır. Bu noktada .NET Compact Framework üzerinde tanımlı olanThread sınıfı standart Thread sınıfının gerekli olan tüm metotlarını bünyesindebarındırmaktadır.

Sınıfın metot ve özelliklerine baktığımızda bir öncekiparagrafta anlatıldığı üzere gerekli ve yeterli olan tüm yapıların hazır olarakgeldiğini rahatlıkla anlayabiliriz.

Bu makalemizde örneklenen uygulamada yaşanan sorun dahaöncede anlatıldığı üzere, uygulama process’ i başlatıldığında bu process’ iniçerisinde o noktadan sonra yürütülecek olan tüm işlemlerin çalıştırılacağıMain (Ana) bir Thread istesekte istemesekte oluşturulmaktadır. Application.Runmetodu ile uygulamamızın başlayan yaşam süreci içerisinde işletim sistemiüzerinen gelen mesajlar sırasıyla işletilmektedirler. Bu noktada yaşananproblem döngü içerisinde “döngü sonlanana kadar” her yeni değerde yeni birmesaj gelmekte ; işletilmekte ve haliyle uygulama içerisinde gönderilen diğermesajlar bekletilmektedirler. Bunun sonucunda ise işlem sonlanana kadaruygulama ekranımız “kilitlenmektedir”. Amacımız bu işlemleri Main (Ana) thread’in dışında yeni bir Worker (İşçi) thread kullanarak uygulamanın temel thread’ idışında çalıştırarak ; uygulama ana ekranının gönderilen diğer mesajlarınçalıştırabilmesini ; başka bir deyişle kitlenmemesini sağlamaktır. Hiç vakitkaybetmeden makalemize kaldığımız yerden devam edelim. Amacımız bir öncekicümlede de ifade ettiğimiz üzere işi gerçekleştirecek Worker (İşçi) bir threadtanımlamak olacaktır.

Kod ile ilgili “ayrıntılı” bir açıklamanın bu noktadagerekli olduğundan satırların numaralandırılmış olması daha doğru olacaktır.

İlk olarak 18 numaralı satır üzerinden geliştirdiğimiz kodbloğunu açıklamaya geçelim. Bu satır içerisinde System.Threading.Threadsınıfının th isminde null bir referansını oluşturmaktayız. Bu null referansıForm1_Load metodu içerisinde System.Threading.Thread sınıfının bir instance’ına eşitliyoruz. Ki bakacak olursak bütün olay bu satırda ; yani 21 numaralısatır içerisinde halledilmektedir.

Thread sınıfının Constructer’ ına baktığımızda, sınıf,uygulama geliştiriciden System.Threading.ThreadStart tipinde bir delegeinstance’ ı istemektedir.

Sınıfın bu delegeyi istemesinin temel sebebi çalıştıracakolduğu metodun adresine ihtiyaç duyduğu zaman çekebilmesi içindir. Bu noktadaThreadStart delegesi sadece “parametre almayan” ve “void geri dönüş değerinesahip” bir metodu adresleyebilmektedir. Bu sebeple 26. Satırdan itibarenSaydir() isimli parametre almayan ve void geri dönüş değerine sahip bir metottanımlanmıştır. Döngümüz ise bu metot içerisinde ise çalıştırılmaktadır. Bunoktada 30. Satırda kontrolün Items koleksiyonu içerisindeki standart Addmetodunun neden kullanılmadığına değinmek çok doğru olacaktır.

Bilindiği üzere asenkron mimariye sahip uygulamalarda Worker(İşçi) thread üzerinden farklı bir thread üzerinde oluşturulmuş bir objeninherhangi görsel bir değerini değiştirememekteyiz. Böyle bir durumdaCrossThreadOperationException tipinde ifade edilebilecek bir hata kaçınılmazolacaktır. Bu noktada kontrolün Invoke metodu ile işlemi lstSAYILAR isimliListe kutusununu oluşturulduğu Main (Ana) thread üzerine geçirmekte ; sayı eklemeişlemini bu lokasyonda gerçekleştirmekteyiz.

Biraz daha yakından incelediğimizde ise Invoke metodu daThread sınıfının istediği türe benzer bir türden çalıştıracak olduğu metodunadresini alabilecek bir delege istemektedir. Fakat bu noktada elimizde hazırbir delege bulunmadığından ListBox kontrolünün Items koleksiyonu içerisindebulunan Add metodu ile aynı geri dönüş değeri ve parametre yapısına sahip birdeleyi kendimiz oluşturup, bunun bir kopyasını lstSAYILAR.Items.Add metodunuadresleyerek Invoke isimli metoda değer olarak göndermekteyiz.

Tüm bu adımlar başarılı bir şekilde gerçekleştirdikten sonra36. Satırda yani btnSAYDIR button’ una tıkladığımızda th isimli Thread objesireferansı üzerinden Thread’ i çalıştırmaya başlatıyoruz. Hepsi bu kadar !

Uygulamayı çalıştırıp Saydır button’ una bastığımız zamansonuç tek kelimeyle mükemmel ! Saydırma işlemi devam ederken ScrollBar hareketettirilebilir durumda olmakla birlikte ekran üzerindeki diğer kontroller işleminbitmesini beklememektedir ; kullanıma açık durumdadır !

Bu makalemizde Mobil cihazlar üzerindeSystem.Threading.Thread sınıfını kullanarak asenkron işlemler nasılgerçekleştirilir bunun üzerinde ayrıntılı bir örnek geliştirdik.

Başka bir makalede daha görüşmek üzere.


4 kişi tarafından 1.5 olarak değerlendirildi

  • Currently 1,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Yorum ekle




biuquote
  • Yorum
  • Canlı önizleme
Loading