‘Thread’ Etiket Arşivi

Bu kitabı almak lazım.. Ama ondan önce mümkünse dilimize kazandırmak lazım..

// 4 Aralık 2012 // 4 Yorum » // Delphi, Programlama

Threading için bulunmaz kaynak..

Threading için bulunmaz kaynak..

Pek çok programcı arkadaşımızın Thread kütüphanesini kullandığı Primož Gabrijelčič ile geçen gün bir e-Mail sohbetimiz oldu. Kendisine kitabını Türkçe’ye çevirmek isteyip istemediğini sordum. Özetle bana; “bundan memnuniyet duyacağını, bu hususta kendisine yardımcı olmak isteyeceklere kapısının her daim açık olduğunu ve kazançtan %50 kâr vereceğini” ifade etti.

Delphi bilgisine ve daha da önemlisi İngilizcesi ve Türkçesine güvenen arkadaşların kendisi ile iletişime geçmeleri hem Türkçemize değerli bir kaynağı kazandıracaktır, hemde uzun uğraşlar neticesinde zorluklarla yapılan kaliteli bir ürünü ve bu ürünü geliştireni de takdir etmemize vesile olacaktır.

Kendisine primoz@gabrijelcic.org mail adresinden yada; Forum sitesinden ulaşabilirsiniz.

Ingilizce bana yeter Türkçe’ye çevrilmesini bekleyemem diyorsanız son derece cüzi bir ücrete sahip olan kitabı bu adresten temin edebilirsiniz.

Hem siz kazanın, hem mükemmel bir ürünü bizlere kazandıran Primoz kazansın hem de ülkemiz kazansın.

Not: Bu işten benim herhangi bir maddi beklentim yahut kazanımım yoktur.

Çeviri süreci bir arkadaşımızın özverili tutumu ile başlamış bulunuyor. Bu husustaki gelişmeleri buradan takip edebilirsiniz.


Ramazan GÜLBAHAR arkadaşımız sayesinde çeviri süreci ciddi bir şekilde ilerlemektedir. Primoz’un sitesinde bu husus hakkında yazdığı makaleye buradanerişebilirsiniz. Aynı zamanda, kitabın Türkçe çevirisi hakkında bilgi bulabileceğiniz ve ön sipariş verebileceğiniz linke ise buradan ulaşabilirsiniz.

Derinlemesine Threading..(3)

// 3 Nisan 2010 // 12 Yorum » // Delphi, İşletim Sistemi, Win32

Threading ile ilgili bir önceki makelemizde Event ve WaitableTimer senkronizasyon mekanizmalarını anlatmış ve konuya ışık tutabilmesi adına örnekler paylaşmıştık. Makalemizin sonunda ise; bir thread’i normal yollarla durdurabilmek için(TerminateThread API’sini kullanmadan) bir makale yazacağımdan bahsetmiştim. Bu makalemizin konusu verdiğim söz gereği; bir thread’i sonlandırma seçenekleri ile ilgili olacak.

Ancak, sizlerden ricam bu makalede ilerlemeden önce Threading ile ilgili yazılmış olan diğer makaleleride okumanızdır. İlgili makalelere aşağıdaki linklerden erişebilirsiniz:

Nedir bu Thread’lerden çektiğimiz..!
Derinlemesine Threading..(1)
Derinlemesine Threading..(2)

Şimdi tüm bu makaleleri okuduğunuzu ve threading hakkında fikriniz olduğunu varsayarak, bir thread’i neden durdurmak isteyebileceğimizi ve karşımıza ne gibi sorunların çıkabileceğini biraz izah etmeye çalışalım. Bildiğiniz gibi thread’leri genellikle paralel programlama yapabilmek, iş yükünü dağıtabilmek, ana uygulamamızın kilitlenmesine mani olabilmek adına kullanırız. Ve bazen, thread’lerimizin içindeki kodlar uzun süreli ve hatta kullanıcı ile interaktif çalışıyor da olabilir.

Bazı durumlarda, yazdığımız thread’lerin içinde çalışan kod bloklarını sonlandırmak isteriz. Buna sanırım en güzel örnek, veritabanına bağlanıp büyük bir sonuç seti çekmeye çalıştığımız zamanlarda programımızın kullanıcısının isteği ile rapor alımını durdurmak verilebilir.

Pek çok programcı bu gibi durumlarda, çalışan thread’ini durdurabilmek için TThread sınıfının Terminated özelliğini kontrol eder. Terminated’in true olması durumunda thread çalışma kodundan çıkılmasını sağlar. Buna küçük bir örnek verebiliriz;

procedure TMyThread.Execute;
begin
  inherited;

  while not Terminated do
  begin
     //...
     //...
  end;
end;

Yukarıdaki örnek, sıklıkla kullanılan çok genel bir örnektir. Malumunuz olduğu üzere; TThread sınıfının Terminate metodu bir thread’i durdurma işini yapmaz. Terminate metodu; Terminated isimli property’nin True olarak set edilmesini sağlar. Programımız içerisinde herhangi bir yerde TThread sınıfının Terminate metodunun çağrılması yukarıdaki kod örneği için ilgili thread’in sonlanması anlamını taşır.

Buraya kadar anlattıklarımızda bir sıkıntı ve bu makaleye hayat verecek bir neden de yok gibi görünüyor. Ancak; bizler her zaman thread’lerimiz içinde yukarıdaki kısa kod örneğinde olduğu gibi Terminated property’sinden istifade edemeyiz. Bu hususta da kısa bir örnek verip devam etmek sanırım daha açıklayıcı olacaktır:
(more…)

Derinlemesine Threading..(2)

// 20 Temmuz 2009 // 10 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Bir önceki makalemizde thread’ler konusuna giriş yapmış, işletim sisteminin thread’leri nasıl yönettiğini ve thread’lerin senkronizasyon mekanizmalarını anlatmaya çalışmıştık. Bu bağlamda Critical Section, Mutex, Semaphore senkronizasyon mekanizmalarını izah etmiştik. İlk makalemizde değinmediğimiz 2 adet senkronizasyon mekanizmasına da bu makalede temas etmeye çalışacağız. Event ve Waitable Timer adı verilen bu mekanizmalar da tıpkı diğer senkronizasyon mekanizmaları gibi çalışırlar. Bu iki sekonronizasyon mekanizması da WaitForSingleObject yada WaitForMultipleObjects vasıtası ile thread’lerimizin belirli kod bloklarında belirli bir şart sağlanana kadar beklemesi için vardırlar.

Hatırlayacağımız üzere, critical section’lar belirli bir kritik kod bloğuna aynı anda birden fazla thread’in girmesine müsaade etmiyordu. Mutex’ler ise critical section’lara son derece benzemelerine rağmen birden fazla uygulamanın(process) thread’lerinin de aynı kod bloklarına girişlerini senkronize ediyordu. Ardından temas ettiğimiz semaphore’ler ise biraz daha farklı bir yaklaşım ile kritik bir kod bloğuna bizim belirlediğimiz sayıda thread’in girmesini sağlıyordu.

Event mekanizmaları da yukarıda sayılan thread senkronizasyon mekanizmaları gibi çalışırlar. Ancak elbette kendine özgü tarafları da vardır. Programlarımızda hangi thread senkronizasyon mekanizmasını kullanacağımız tamamen ihtiyaçlarımız ile doğru orantılıdır. Birinin bir diğerine üstünlüğü gibi bir şey söz konusu değildir. Tüm bu bahsedilen mekanizmaların asıl amacı, işletim sistemindeki thread geçişlerinin 20 ms. olduğu bir ortamda veriye hatasız bir şekilde erişmek ve kullanabilmektir.

Event mekanizmaları, birden fazla thread’in ortaklaşa çalışması söz konusu olduğunda anlamlı olurlar. Bir thread’in bir diğer thread’i beklemesi gerektiğinde, kısaca bir ekip ruhunun gerektiği noktalarda bu mekanizma son derece kullanışlıdır. Eğer kodlarınızın bir ekip ruhu ile çalışması gerekiyor ise, aralarında bir imece söz konusu ise o halde bu mekanizmayı bilmeniz faydalı olacaktır.
(more…)

Derinlemesine Threading..(1)

// 5 Temmuz 2009 // 31 Yorum » // Delphi, İşletim Sistemi, Win32

Hâla programlama aleminde threading uzak kalınası bir mesele gibi gözlemleniyor. Aslında belli başlı kurallar bilindiğinde bu konunun korkulacak bir konu değil ancak dikkatle ele alınması gereken bir konu olduğu anlaşılacaktır. Genellikle thread dediğimiz mekanizmayı yazdığımız kodların paralel çalışabilmesi için kullanırız. Ancak kullandığımız işletim sistemleri gerçek mânada multi-threaded olmadıkları için hepimizin başına bir ton sorun gelmiştir ve thread’lere lanetler okumuşuzdur. Dolayısı ile onlardan uzak kalmaya mümkün mertebe gayret etmişizdir. Bu makalede amacım, siz değerli okuyucularımı bu mekanizmaya yaklaştırmak, varsa çekincelerinizi bilgim dahilinde gidermeye çalışmak olacaktır.

Thread’lerle düzgün şekilde çalışabilmek için öncelikle çok derin olmasa da orta seviyede işletim sistemi çalışma mekanizmasına aşina olmalıyız. Bu bağlamda işletim sistemleri üzerinde nispeten az bilinen hususlara değinmeye çalışacağım.

İyi bir programcı, üzerinde çalıştığı işletim sistemini tanıyan, onun neleri yapabileceğini ve neleri yapamayacağını bilen programcıdır. Bu öngörü, her zaman düşük seviyeli işletim sistemi bilgilerine müracaat etmeniz gerektiği anlamına gelmez. Yüksek seviye bir dil de kullanabiliyor olabilirsiniz, ancak her zaman olayın arka planında neler olduğunu bilen bir programcı diğerlerine oranla basamaklarca önde olacaktır. Tercih tamamen sizlere aittir. “Çok derin bilgilere girmem, bildiklerim bana yeter, ekmeğimi kazanırım keyfime bakarım” düşüncesinde iseniz, bildiklerinizin size yetmeyeceği gerçeği ile birgün karşılaşacağınızı üzülerek ifade etmek zorunda kalacağım. Her geçen gün sürekli değişen bir bilişim dünyasında kalıcı olabilmeniz; temel seviye bilgilerinizin yüksekliği ile doğrudan orantılıdır.

Yüzyüze karşılaştığım, yada bir şekilde derinlemesine programlama alemi ile ilgili muhabbete girdiğim arkadaşlarıma verdiğim tavsiyeler hep bu yönde olmuştur. Benim kişisel kanım, iyi bir programcının her zaman üzerinde çalıştığı sistem hakkında bilgiye haiz olması üzerinedir. Hemen hemen her programcı, günümüz popüler dillerinde nesneye yönelik programlamayı, pointer’ları ve daha pek çok low level teknolojiyi farkında olarak yada olmayarak kullanmaktadır. Dileğim odur ki, sizler farkında olanların safında olun. Bu farkındalık, sadece şahsınıza değil; şahsınız nezdinde pek çok insana ve hatta ülkenize de faydanız olacağı mânasına gelir.

Blog’umuz genel mânada Delphi üzerine olduğu için vereceğim örnekler Delphi üzerine olacaktır ama bu söylemler programlama ile uğraşan herkesi ilgilendirir. Delphi’ye yeni başlayan birisi dahi olsanız, farkında olmadan pointer’ları kullanıyor, nesneye yönelik programlama dünyasının avantajlarından sonuna kadar istifade ediyor, design pattern denilen popüler programlama konseptlerini programlarınızda kullanıyorsunuz demektir. Delphi, bu derin bilgi gerektiren hususların kullanım zorluklarını, kullanıcılarından gizleme konusunda son derece maharetlidir. Makalemde ilerlemeden evvel, her programcı arkadaşıma Delphi’nin kaynak kodlarında dolaşmasını öneriyorum.
(more…)

TThread.WaitFor Bug..

// 26 Haziran 2009 // 7 Yorum » // Delphi

Yakın bir zamanda TThread sınıfına yine işim düşmüştü. Yazacağım bir kod parçasında bir thread’in işinin bitmesini beklemem gerekiyordu. Kodumu bu şekilde geliştirirken Delphi’nin bir bug’una rastladım ve bu hatayı Delphi ürün müdürü Nick Hodges‘a ilettim. Sorunun bir sonraki Delphi sürümünde ortadan kalkacağına inanıyorum.

Kısaca sorunun ne olduğundan bahsettikten sonra, mail yazışmalarımızı ilgilenenler için paylaşacağım. Bildiğiniz gibi TThread sınıfının WaitFor metodu bir thread’in işinin bitmesini beklemek için tasarlanmıştır. Ve görevini layıkı ile yerine getirir. Ancak, eğer thread kendi constructor’ında işi bittikten sonra yok edilsin ayarına set edildi ise o zaman bu bug ile karşılaşacaksınız. Thread’inizin constructor ‘ında FreeOnTerminate := true gibi bir satır kod yazdı iseniz ve thread’inizin bitmesini WaitFor ile bekliyorsanız, thread’inizin bitmesine müteakip hata ile karşılaşacaksınız. Bunun nedeni, Thread sınıfının destructor’ında işletim sistemi tarafından ayrılmış olan thread handle’ının CloseHandle ile serbest bırakılmasına karşılık WaitFor metodu içinde bu handle’ın kullanılmaya çalışılmasıdır. Sizlere bu sorun düzeltilinceye kadarki tavsiyem WaitForSingleObject(myThread.Handle, INFINITE) kodu ile bekleme yapmanızdır.

Delphi ürün müdürü ile yazışmalarımız aşağıdaki gibidir:
(more…)

TIdHTTP Partial Download(Parça Parça Download)

// 30 Mayıs 2009 // 20 Yorum » // Delphi, Internet, Programlama

Hemen hemen hergün internetten birşeyler indirip duruyoruz. Kimi zaman çeşitli resim dosyaları, kimi zaman videolar kimi zamanda işimizle alakalı yada değil başka materyaller. Bu dosyaları bilgisayarımıza indirirken çoğu zaman indirme yönetici programlarından istifade ediyoruz. FlashGet, GetRight gibi. Bu programların indirilecek dosyayı bir kaç parça halinde indirme özellikleri olduğu gibi, herhangi bir bağlantı sorununda kaldıkları yerden devam edebilme gibi akıllı özellikleri var. Bizlerin onları tercih etmesindeki yegane neden de bu zaten. Peki hiç düşündünüz mü, internetten bir dosya bir kaç parça halinde nasıl indirilebiliyor ? Yada indirme işleminde sorun olduğunda kalınan yerden indirmeye nasıl devam edilebiliyor ?

Bir önceki makalemde BITS konusunu ele almıştım. BITS’de dosyalarımızı sessiz sedasız indirme yeteneğine sahipti. Aynı zamanda kaldığı yerden devam da edebiliyordu. Ancak arka planda ne gibi bir teknoloji kullandığı hakkında hiçbir fikrimiz yok. Nasıl yapıyor da internet üzerindeki bir dosyayı belirli bir yerinden okumaya başlayabiliyordu.. Aynı sorular diğer indirme yöneticileri için de sorulabilir elbette. İşte bu makalemizde bu konuya biraz ışık tutmaya çalışacağız. Ben sizlerle paylaşacağım örneğimde aşağıda göreceğiniz resim dosyasını bilgisayarıma indirmeye çalışacağım. Siz başka bir kaynak üzerindeki herhangi bir dosyayı deneyebilirsiniz. İşte indireceğimiz dosya ;)

turboman
(more…)

TThread & TQueue işbirliği..

// 26 Mayıs 2009 // 4 Yorum » // Delphi, Programlama

Kısa bir aradan sonra tekrar merhaba, bu makalemde iki önemli sınıfın birbirleri ile iletişiminin nasıl olacağını ve yaptıkları işbirliğinin getirilerini izah etmeye gayret edeceğim.

Malumunuz odur ki, hemen hemen her programcı time-critical kod parçacıklarında TThread nesnesine en azından bir kere müracaat etmiştir. Thread’ler programlama dünyasında işimizi kolaylaştıran son derece faydalı yapılardır. Ancak faydaları olduğu gibi, dikkatle kodlanmalarını gerektirecek pek çok neden de var. Bu nedenleri dilim döndüğünce daha evvel izah etmiştim. İlgilenen arkadaşlarımın öncelikle thread’ler hakkındaki makalemi okumasında yarar olduğunu düşünüyorum.

Bu noktadan sonra thread’ler hakkında bir fikre sahip olduğunuzu varsayarak ilerleyeceğim. Makalemize konu olan yararlı işbirliğinin diğer tarafındaki sınıfımız ise TQueue sınıfı. Bu sınıf, ilk giren ilk çıkar(first in first out) prensibine göre tasarlanmış bir Delphi sınıfı. Bu sınıfın tam zıttı olan TStack sınıfı ise tahmin edeceğiniz gibi son giren ilk çıkar(last in first out) mantığına göre tasarlanmış bir sınıf. Lâkin şimdi bizim konumuz TQueue.
(more…)

Nedir bu Thread’lerden çektiğimiz..!

// 16 Mayıs 2009 // 7 Yorum » // Delphi, Programlama

Uzun yıllık programcılık hayatımda pek çok defalar Thread kullandım ancak ilk defa bu kadar yoğun ve derinlemesine kullanma ihtiyacı hissettiğim bir projede çalıştım. Bu projemde TThread sınıfı ile uğraşırken karşılaştığım bazı sorunları sizlerle de paylaşmak istedim. Sizler önlemlerinizi baştan alın ki, saç baş yolmayın…

Eğer gerçekten time-critical işler yapıyorsanız thread’iniz içerisinde kesinlikle Synchronize kullanmayın.Çünkü Synchronize çağrısı thread’in çalışmasını kesip main thread’e geçirir.

Eğer siz TThread sınıfından türettiğiniz kendi sınıfınızda Execute metodunda bütün işi Synchronize metoduna teslim etmiş iseniz o zaman siz MTA (Multi Threaded Application) değil STA (Single Threaded Application) geliştiriyorsunuz demektir.. Yani ha formunuzun bir metodunu çağırmışsınız ha bir Thread create etmişsiniz.Arada hiçbir fark olmaz.! Bir örnek vermek gerekir ise:

TMyThread = class(TThread)
private
  fErrorString : String;
  procedure CallExternalProc;
protected
  procedure Execute; override;
public
  constructor Create;
  property ErrorString read fErrorString write fErrorString;
end;

constructor TMyThread.Create;
begin
  inherited Create(true); // Bekler vaziyette oluştur.!
  FreeOnTerminate := true; // Thread terminate olduğunda nesneyi Free et.!
  Resume; // Thread başlasın artık
end;

procedure TMyThread.CallExternalProc;
begin
  frmMain.Bilmemne;
  frmMain.BaskabirMetod;
  ...
  ...
 // Burada ise pek çok hesaplama vs. yaptığınızı düşünelim.!
end;

procedure TMyThread.Execute;
begin
  inherited;

  try
    Synchronize(CallExternalProc);
  except on E: Exception do
  begin
    ErrorString := Format('TMyThread: Error occured. %s, %s', [E.ClassType.ClassName, E.Message]);
  end;
end;

(more…)