https://www.youtube.com/watch?v=sErH9dmZKfw&t=2s

Thread Nedir?

Bir proses altında birden fazla işlem yapabilen yapı.Her uygulama bir thread üzerinde çalışır bu main thread olarak adlandırılır.

Neden Thread Kullanılır?

  • İşlem süresi uzun süren işlerde süreyi kısaltmak için
  • Bekleme süresi uzun süren işlemlerde çökmeyi önlemek için
  • Parti yazılımlar ve Port paylaşımlarını düzenlemek için

Delphide Thread Kullanım Çeşitleri

  • Anonymous Thread
  • TThread. Queue
  • TTherad.Synchronize(TThread. Queue ile tek farkı iş yükü sıralamaları farklı)
  • TParallel

Delphi ile bir masaüstü uygulama yapmak istediğinizde Delphi ve Database ‘e hakim olmanız yeterli olacaktır. Ama Threadlarda çok iyi bir Delphi kullanıcısı olmanız yeterli olmuyor. İşletim sistemi ve Ram yönetimi nasıl oluyor bilmeniz lazım.Thread’da temel mantık mümkün olduğu kadar küçük ve diğer Threadların işine karışmayan bir iş yükü bölümü. Thread için ne main Thread’e ne de oluşturduğumuz Thread’e aynı ram alanına ulaşılması istenirse thread donar.Bunu önlemek için Anonymous Threadlerde iki yöntem mevcut: TThread. Queue ve TTherad.Synchronize bunlar işletim sistemi tarafından sağlanan yapılar. Aralarındaki fark iş yükü sıralamaları. Eğer Synchronize içine procedure alıp onu kullanırsanız main thread’daki iş ile sizin açtığınız thread’deki işi senkronize eder. Yani arada durdurma başlatmayı siz  ayarlamak zorunda kalmazsınız bu da threadlerin çökmesinde önemli bir nedendir. Synchronize’ da çakılmalar olmaz fakat yavaşlık olur çünkü main thread ile sürekli haberleşir ve boş kaldığında işlem yapar.Bu yüzden main thread’e gömderdiğiniz kısımlar kısa olmalı. Queue ise sizin threadlerinizi main thread’in sonuna ekler. Performans için kullanabileceğiniz bir thread yapısı TParallel kütüphaneleri dir.

DEMOLAR

File >New >Multi- Device Application >Blank Application. Kaydet >Yeni klasör→w4 - Unit2 →uMain - Project1 →P4 şeklinde isimlendirip kaydettik. Palette > Memo1 - Memo2 - Button1 - Button2. Button1 > name →btnBasla - Button2 >name →btnBitir. BtnBasla’ ya çift tık ile kod satırımıza gidiyoruz. Type kısmına yazacağımız Thread’in class’ının tanımlamasını yapıyoruz.
type
TBasitTrd = class(TThread)
private
public
FMemo : TMemo;
FBekle : Integer;
FBasla : TButton;
BtnBitir : TButton;
procedure execute; override; // execute’ü override etmek gerekiyor miras aldığımız execute’ün içerisine bir şey yazmak için
constructor olustur(memo : TMemo; bekle : integer;baslangic : integer);

Shift + Ctrl +C ile deplphinin bizim için açtığı kod satırlarına gidiyoruz. Thread'in ana kısımları oluşturuldu.


constructor TBasitTrd.olustur(memo:TMemo;bekle,baslangic : integer);
begin
inherited
end;
end.

Kod satırımız bu şekilde geldi inherited’ın karşısına “create (false);”  yazıyoruz sonrasında sadece inherited’ı kopyalıyoruz ve aşağıdaki gibi procedure kısmına yapıştırıyoruz kodumuzu yazmaya başlıyoruz.
procedure TBasitTrd.execute;
begin
   inherited;
   while not Terminated and (Fbasla>0) do
   begin
   Dec(Fbasla); //eksiltme
   Sleep(FBekle); //fbekle kadar beklemesini istedik
   Fmemo.Lines.Add(Fbasla.ToString);
end;
end.

constructor TBasitTrd.olustur(memo : TMemo : bekle, baslangic : integer);
begin
inherited; create(false); 
FBekle:= bekle; //parametreyle aldığımız değerleri thread'in içine göndermek için
Fmemo:= memo;
Fbasla:= baslangic;
end;
end.

Threadleri tanımlıyoruz;


public
{Public declarations}
var
  T1, T2 : TBasitTrd;
end;

btnbasla’ya çift tık kod satırına gidiyoruz, threadleri create etmek için. Create yerine oluştur kullanmıştık;


procedure TForm2.btnBaslaClick(Sender : TObject);
begin
   T1:= TBasitTrd.olustur(Memo1,10,100); //(parametre, bekleme süresi,kaçtan başlıyacağı)
   T2:= TBasitTrd.olustur(Memo2,20,50); //(parametre, beklemesüresi, kaçtan başlıyacağı)

Arada durdurmamız gerekirse ne yapacağız bunun için BtnBitir'e çift tıklıyoruz;


procedure TForm2.BtnBitirClick(Sender : TObject);
begin
   T1.Terminate;
   T2.Terminate; //bu şekilde thread’i durdurabiliriz.

Çalıştırıyoruz sorunsuz bir şekilde çalışıyor.

Aynı  uygulama üzerinde Syncronize olarak çalıştıralım çünkü bu daha güvenli. Bir tane daha Buton ekilyoruz. Button1 >name →BtnSync. BtnSync’e çift tıklıyoruz ve kod satırına gidip kodumuzu yazmaya başlıyoruz.


procedure TForm2.BtnSyncClick(Sender : TObject);
begin
// Shift +Ctrl +1 ile bir yapı oluşturuyoruz.
end.

Sonra private’e gidiyoruz diğeriyle aynı gelmesi için aynı şekilde oluşturuyoruz;


private
{Private declarations}
function SynBasla(Memo : TMemo bekle : integer; baslangic :integer) : Boolean;

Shift +Ctrl +C diyerek bizim için tanımlanan fonksiyonumuza gidip kod yazmaya başlıyoruz.


function TForm2.SynBasla(Memo : TMemo; bekle ,baslangic : integer) : Boolean;
begin
Result :=False;
   try //thread'i yazmaya başlıyoruz
   TThread.Synchronize(TThread.CurrentThread) //Geçerli olan ana thread ile synchronize edeceğiz.
   procedure
     begin
       while (baslangic >0) do
       begin
         Dec(baslangic);
         Sleep(Bekle);
         memo.Lines.Add(baslangic.ToString);
       end;
     end;
 finaly
Result:= True
end;
end.

SynBasla foksiyonunu BtnSync ile çağıralım BtnSync’e çift tıklıyoruz;


procedure TForm2.BtnSyncClick (Sender : TObject);
begin
   SynBasla(Memo1,100,100)
   SynBasla(Memo2,50,50);
end;

Çalıştırıyoruz,  BtnSync’e tıklıyoruz thread’i synchronize etti fakat değerler hemen gelmiyor (donuyor) çünkü işlemleri sıraya koyuyor.Thread da en iyi kullanım için küçük iş parçaları ve dışarıdan bir nesneye ram alanına erişmiyor olmasına dikkat edilmelidir. Normalde işini yapıp en sonda result’ı uyarıyor aktarıyor olması gerekir. Diğer Thread kullanımlarınıda aynı yapı üzerinde deneyebilirisniz, aynı şekilde veriler gelecektir.

Firma Bilgileri


Camart Araştırma Geliştirme Yazılım Otomasyon San. Tic.Ltd. Şti.

Mersis no : 3356 7133 6775 9746

info@camartarge.com

Vergi no : 196 074 62 30

Tel : +90 850 333 80 20

İban (TL): TR30 0020 5000 0085 3809 5000 03

Arge :

Paü teknoloji geliştirme bölgesi (Teknokent)

idari bina d blok no g05 Denizli

 

İban (USD):TR03 0020 5000 0085 3809 5001 01 


Barbaros Mah. Halk Cad. No 47 / 2 34746 Ataşehir İstanbul

İban (Euro):TR73 0020 5000 0085 3809 5001 02 

 
 
 
 
 
 
Harita verileri ©2015 Google

İletişim

Facebook Pinterest Twitter Google+ Dribbble