Cross Threading - I

Cross Threading - I Cross Threading - I   Cross Threading aslında makine mühendislerinin bir konusu olarak bilinmektedir. Cross-threading, bujinin buji deliğine farklı bir açıyla girmesi sonucunda oluşur. Bu varolan vidaları daha derine iterek diğer vidaların bozulmasına ve zamanla bozulmasına sebep olur. Bu bozulmuş (özellikle yan yatmış) vidalar bujinin deliğe düzgün bir şekilde oturmasına engel olur. Bu hatayı group düzeltmeye çalışsanız bile bir sure sonra buji deliği aşınmış olduğundan buji asla tam olarak oturamayacaktır.Programlama açısından bakıldığında cross threading Windows uygulamaları için önemli bir güvenlik konusudur. Özellikle Windows Vista ile birlikte önemini tüm uygulama geliştiriciler farketmek zorunda kalacaktır. Zaman alan bir işlemi gerçekleştirmek için genellikle yeni bir thread oluşturulur. Bu thread arka planda zaman alan işi gerçekleştirirken uygulamamızın ana thread’i isteklere cevap verebilir durumda olacaktır. Zaman alan bu işlemin ne kadar süreceği hakkında her zaman bir bilgimiz olmadığı için bu işlemin ne zaman bittiğini de kestiremeyebiliriz. Bu zaman alıcı işlemi tamamladıktan sonra kullanıcıya bilgi vermek için ekrandaki kontrolleri doldurulabilir ya da değiştirilebilir. Aynı process içerisinde farklı threadlerin bu şekilde kullanıcı arayüzüne erişimine izin vermek uygulamamızın yeni gelişen truva atlarına karşı dayanaksız hale getirecektir.Peki uygulamalar cross threading ile truva atlarına karşı nasıl dayanıksız bir hale gelebilir?Örnek vermek gerekirse, “Troj/Torpig-AE” isimli truva atı Windows platformunda bilgileri çalmak için geliştirilmiş bir truva atıdır. Kullanıcı adı şifre çalmak, basılan tuşları pencere başlıklarına gore loglamak ve periyodik olarak bu bilgileri HTTP ile uzaktaki bir kullanıcıya göndermek asli görevleri arasındadır. Bu truva atı kendisini explorer.exe’ye ekleyerek bu işlemi gerçekleştirmektedir. Bu şekilde kullanıcıdan kendisini gizleyebiliyor. Belki de en korkuncu SSL trafiğini şifrelenmemiş olarak izleyebilmesidir. Bu truva atı önümüzdeki yıllarda çıkacağını düşündüğüm bir çok truva atının atası olarak anılacaktır. Şu an ki güncel antivirus yazılımları bu truva atını etkisiz hale getirebilmektedir. Truva atının kendisinin explorer.exe’ye eklemeyi şu şekilde başarmaktadır:“HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon”Anahtarının değerindeki komut windows’a her giriş yapıldığında çalıştırılmaktadır. Varsayılan olarak bu anahtarın değeri explorer.exe dir. Bu sayede her giriş yaptığımızda explorer.exe otomatik olarak yüklenir. Ama truva atı buraya tüm bu bahsettiğimiz işleri yapacak olan exe’yi de eklemektedir. Bu exe explorer ile beraber çalışırken cross-threading ile internet explorer pencerelerine istediği gibi müdahale edebilmektedir. Sevindirici haber ise Windows Vista ile bunun mümkün olamayacağıdır. Her thread kendi penceresiyle ilgilenecek, aynı process içinde de olsa farklı threadler aynı pencereye erişemeyecektir. Ne büyük mutluluk !! :)Ayrıca Microsoft .NET 2.0 farklı threadlerin aynı pencereye erişimlerini kontrol etmektedir. Buna karşın çalışma zamanında bir hata vermemektedir. Sadece debugging aşamasında bu hatayı uygulama geliştiriciye iletmektedir. Windows Vista ile bu kontrolün çalışma zamanında da yapılacağı müjdesini verdikten sonra neden cross threading’e ihtiyaç duyduğumuzu bir örnek ile açıklamak istiyorum.Windows uygulamalarında kullanıcı ile uyguylamanız arasında bir arayüz vardır. Kullanıcı bu arayüz ile sağlanan özellikleri kullanarak uygulamanıza iş yaptırır. Buna karşın kullanıcılar bu işlemlerin tek tuşla ve hemen olmasını istemektedirler. Uygulamanın arka planda ne kadar yoğun işler yaptığını dikkate almaksızın hemen olmasını beklemektedir. Kullanıcılar için uygulamanın arka planda veritabanındaki milyonlarca kayıt arasında arama yapıyor olması kabul edilebilir bir bahane değildir. Eğer ki, uygulamamızı geliştirirken örneğin bir buton’a basıldığında yapılması gereken işi hemen o buton’un arkasına yazarsak, işlem bitinceye kadar kullanıcı arayüzümüz kilitlenecek ve uygulamamız isteklere cevap veremiyor hale gelecektir. Bu durumda kullanıcı uygulamanın bozulduğunu (kilitlendiğini) düşünecek ve uygulamayı kapatmak için bildiği tüm yöntemleri kullanacaktır.Şimdi, örnek bir uygulama geliştirelim. Zaman alıcı işlem oluşturmak yerine o anki çalışan thread’i durdurmak bu durumu oluşturmamıza yetecektir. Tabi ki de aynı durumu oluşturmamış oluruz. İşlemcinin diğer processlere zaman ayırmasını sağlıyoruz. Ama burada odaklanmamız gereken uygulama arayüzünün donup kalmasıdır:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace CrossThreading { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void sampleButton_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(20000); } } }Kullanıcının “Do Something” yazan buton"a basmasıyla tüm kullanıcı arayüzümüz donup kalacaktır. Eğer kullanıcı form üzerinde herhangi bir yere tıklamak isterse uygulamamız geçici olarak "cevap vermiyor(not responding)" durumuna düşecektir. Bunun sebebi kullanıcı arayüzünün ana thread"i kullanıcının uygulamadan yapmasını istediği zaman alıcı işi yapmasıdır. Uygulamamız windows tarafından kendisine iletilen mesajları bu işlem bitinceye kadar alamayacaktır. Kullanıcınnın arayüzdeki herhangi bir yere tıklaması sonucu ekranı aşağıdaki gibi donup kalacaktır:Bu problemi düzeltebilmek için uygulama geliştiriciler bir butona tıklanmasıyla çalışacak kodun hemen arkasında zaman alıcı işi yapmak yerine yeni bir thread açarak bu thread üzerinde bu işlemlerini gerçekleştirebilirler. Buton"a tıklandığında çalışacak kodu aşağıdaki kod parçacığıyla değiştirmek bu sorunumuzu düzeltecektir.private void sampleButton_Click(object sender, EventArgs e) { System.Threading.Thread th = new System.Threading.Thread( new System.Threading.ParameterizedThreadStart(DoSomething)); th.IsBackground = true; th.Start(); } private void DoSomething() { System.Threading.Thread.Sleep(20000); } Bununla beraber bu çözüm bizi cross threading problemleriyle karşı karşıya bırakacaktır. Daha öncem de dediğimiz gibi Microsoft .NET Framework 2.0 ile cross threading yukarıda saydığımız güvenlik gerekçesiyle engellenmiştir.Bir sonraki makalemizde bu durumu oluşturacağımız örnek bir uygulama geliştireceğiz. Bu uygulamada, uygulamımız yüklenirken kullanıcıyı oyalamak için bir önyükleme("splash") resmi göstereceğiz. Uygulamamız arka planda yüklenirken kullanıcı bu resmi görecektir. Uygulamamız bittiğinde bu resmi gösteren form"u kapatacağız. Öncelikle hatanın nasıl oluştuğunu gördükten sonra çok basit bir çözüm ile uygulamamızdaki bu problemi ortadan kaldıracağız. Bir sonraki makalemizde görüşünceye kadar güvende kalın !!!

Döküman Arama

Başlık :

Kapat